我只想显示长双精度中的两个小数位,而不四舍五入。
例:
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;