本文介绍了如何格式化浮点值,使其从不使用指数符号也不具有尾部零?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

根据,我基本上可以选择格式化不带指数符号的浮点数(十进制数)时,默认浮点数固定



但是,我想选择,这将产生很多 1。),固定的尾部零,但避免使用指数符号。如果设置为 defaultfloat ,它将看起来最正确的时间,除非该值真的很小,但不是 0。。在这种情况下,默认表示自己切换到科学记数法,这打破了格式化输出的接收器(因为它不知道 2.22045e-16 意味着什么。 / p>

那么,我怎么能拥有我的馅饼,也可以吃它?也就是没有不必要的尾部零的非指数符号






解决方案

Since there doesn't seem to be a proper way to do this with the stdlib, here's my wrapper.

  template <typename T>
  struct FpFormat {
    template <typename Stream>
    static Stream& setfmt(Stream& str) {
      return str;
    }
    template <typename String>
    static String const& untrail(String const& str) {
      return str;
    }
  };
  template <typename T>
  struct FpFormatFloats {
    template <typename Stream>
    static auto setfmt(Stream& str) -> decltype(str << std::fixed << std::setprecision(std::numeric_limits<T>::digits10)) {
      return str << std::fixed << std::setprecision(std::numeric_limits<T>::digits10);
    }
    template <typename String>
    static String untrail(String str) {
      if (str.find('.') == String::npos)
        return str;
      return ([](String s){
        return String(s.begin(),s.begin()+((s.back() == '.')?(s.size()-1):s.size()));
      })(str.substr(0,(str+"0").find_last_not_of('0')+1));
    }
  };
  template <> struct FpFormat<float> : FpFormatFloats<float> {};
  template <> struct FpFormat<double> : FpFormatFloats<double> {};
  template <> struct FpFormat<long double> : FpFormatFloats<long double> {};

  template <typename T>
  std::string toString(T x) {
    std::stringstream str;
    FpFormat<T>::setfmt(str) << x;
    return FpFormat<T>::untrail(str.str());
  }

这篇关于如何格式化浮点值,使其从不使用指数符号也不具有尾部零?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

10-27 21:27