【问题标题】:Remove all trailing zeros from a double while formatting in a string in C++在 C++ 中格式化字符串时从双精度数中删除所有尾随零
【发布时间】:2020-12-17 15:53:31
【问题描述】:

我想从一个双精度数中删除所有尾随零。我知道我可以使用std::setprecision() 来打印它,但我想修改实际数字,使其仅在小数点后两位数。

class Circle {
    private:
        double r, PI = 3.14159;
    public:
        Circle(double r) {
        this->r = r;
    }
        double area() {
            return PI * r * r;
        }
    double circumference() {
        return 2 * PI * r;
    }
        double getRadius() {
            return r;
        }
        string toString() {
            string str;
            str += "Circle{radius=" + to_string((r)) + "}";

            return str;
        }
    };

twoString() 函数中,我只想将半径返回到两位十进制数字,但是,在通过 2.5 后,我得到了“Circle{radius=2.500000}”,同样,对于 4,我得到了“Circle{radius” =4.000000}”。我希望这里只有 4 个。

【问题讨论】:

  • 如果您想要“固定”精度,我会考虑使用int,只需将其乘以 100。

标签: c++ string class double precision


【解决方案1】:

修改原始编号无效,因为double 的数据格式应在您的平台中定义(通常为 IEEE754 格式)。

std::stringstream 应该会有所帮助。可以这样使用:

string toString() {
    std::stringstream ss;
    ss << "Circle{radius=" << r << "}";

    return ss.str();
}

【讨论】:

  • 像魅力一样工作,谢谢。我应该更多地关注stringstream。您能否解释一下为什么案例中没有尾随零?
  • @Sherlock:请参阅 stackoverflow.com/a/17342002/103167,其中解释了 setprecisionfixed 如何协同工作。
【解决方案2】:

或者你可以这样做:

rad = (r * 100) / 100;

然后在您的打印方法中使用 rad 而不是 r。这会将其截断到小数点后 2 位。

如果要四舍五入,使用

rad = ceilf(r * 100) / 100;

【讨论】:

  • rad = (r * 100) / 100; 不会截断。
猜你喜欢
  • 2014-02-02
  • 2012-12-21
  • 1970-01-01
  • 2014-08-09
  • 1970-01-01
  • 2020-08-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多