gpt4 book ai didi

c++ - 在 C++ 中将数字四舍五入到小数点后两位

转载 作者:行者123 更新时间:2023-12-05 01:05:37 26 4
gpt4 key购买 nike

无论 float 是多少,我都希望将浮点变量四舍五入到小数点后两位。我当前的代码如下所示:

void MainMethods::convert(float& floatValue, string numericString) 
{
floatValue = stof(numericString); //converts string to a float
floatValue = ceil(floatValue * 100.00) / 100.00;
}

这只是将字符串转换为 float ,然后使用 ceil() 进行四舍五入。当我有整数或超过 3 位小数的数字时,这很好用。但是,当输入 2 个小数的值(例如 567.56)时,该值将返回 567.57。我该如何阻止这种情况?

最佳答案

您看到的问题是因为浮点值不能准确地表示所有非整数值。 What Every Computer Scientist Should Know About Floating-Point Arithmetic

您必须记住的是,表示 1 到 0 之间值的所有位仍然是 2 的幂(尽管是负幂)。

2^-1    => 0.5
2^-2 => 0.25
2^-3 => 0.125
2^-4 => 0.0625
etc.

因此,要表示一个浮点值,您需要不断添加这些越来越小的值,直到接近您想要的值。

查看你的 float :

567.57

Float remainder   Rep         Value
.57 => 2^-1 => 0.5
.07 => 2^-4 => 0.0625
.0075 => 2^-8 => 0.00390625
.00359375 => 2^-9 => 0.001953125
.001640625 etc..

注意:这并不完全是这样做的,而是为了演示问题。

因此,每当您使用任何类型的浮点值时,都会遇到舍入问题。当您在某个流上打印以 10 为底的值时,这一点尤其明显,但每次操作都会发生这种情况。

因为您使用的是小数点后 2 位,所以我假设您试图表示某种形式的货币值(value)?

我会将数字保留为整数。
这样你就可以准确地表示它。然后你可以添加一个打印功能来添加小数位。

#include <string>
#include <iostream>
#include <iomanip>

class Money
{
long value; // in cent.
public:
Money(std::string const& value)
: value(stof(numericString) * 100)
{}
friend std::ostream& operator<<(std::ostream& stream, Money const& money)
{
stream << (money.value / 100) << "."
<< std::setw(2) << std::setfill('0') << (money.value % 100);
return stream;
}
};

int main()
{
Money myCurrentAccount("1000000.56");

std::cout << myCurrentAccount << "\n";
}

关于c++ - 在 C++ 中将数字四舍五入到小数点后两位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70570799/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com