C++长双精度格式而不舍入



我只想显示长双精度中的两个小数位,而不四舍五入。

例:

14.999999 => 14.99

12.501 => 12.50

12.505 => 12.50

某些值存在问题。

例如:

例外 204969/340 = 602.85

我的结果 204969/340 = 602.84

代码示例:

long long a = 204969;
long long b = 340;
long double final_result = (long double) a / (long double) b;
final_result = ((long long)(final_result * 100) / 100.00);
cout << fixed << setprecision(2) <<final_result;

为什么?

问题是204969/340,当表示为双精度时,并不完全是602.85,而是602.849999999999999978,这个值乘以100给出60284.9999999999999978,这个值转换为long long得到60284,这个除以100.00得到602.840000000000031832,然后以2的精度四舍五入,最后打印602.84

我会在long的基础上做"乘以 100",最后除以100.0

long double final_result = (a*100/b)/100.00;

然后得到602.850000000000022737,并四舍五入到精度 2 打印602.85

这就是二进制表示的本质。您要求的结果是小数位,但浮点没有小数位。它有二元位置,两者是不可比拟的。如果你想要小数位,请使用十进制基数,即按照标题中所说的去做,并使用掩码将双精度格式化为字符缓冲区。

乘以然后除以 100 的技术不起作用。请参阅此处以获取证据。

可能是与长双精度相关的差异错误

我尝试了以下代码:

long long a = 204969;
long long b = 340;
double final_result = (double)(a*100/b)/100;

它给了我:602.85。

如果你只需要它来输入结果,你可以在不使用双精度的情况下做到这一点:

long long result = a*100/b;
printf ("Result = %ld.%ldn", result/100, result % 100); 

final_result仍然长双精度时使用地板函数,以便清除小数位然后转换为长长

long long a = 204969;
long long b = 340;
long double final_result = (long double) a / (long double) b;
final_result = ((long long)(floor(final_result * 100)) / 100.00);
cout << fixed << setprecision(2) <<final_result;

最新更新