-2

我有一个奇怪的问题,如果我输入 720.60 到

sscanf("%f", &amount);

其中 amount 是 float 类型,变量中的值更改为 720.59967。

我怎样才能绕过它并防止它改变我的价值?

4

3 回答 3

1

您可以打印更少的数字,或使用double. 单精度 IEEE-754float值具有23 位尾数,这意味着它具有大约 7 个十进制数字的精度。您看到的值尽可能接近:没有float比 720.59967 更接近 720.60 的值。

事实上,float最接近 720.60 的两个值的确切值是:

720.5999755859375      (slightly less than 720.60)
720.60003662109375     (slightly more than 720.60)
于 2013-09-13T08:19:36.467 回答
0

你不能这样做。这是精度问题,即C 中使用的浮点格式不能准确表示720.60。您可以尝试double 输入 for amount,这将提高您的精度,但您仍然无法获得准确的值。

有关更多讨论,请参见此链接

于 2013-09-13T08:19:30.323 回答
0

如果您需要小数点后的固定位数,例如 2,则可以使用浮点数。

在“.”处拆分输入字符串,并将“720.60”视为两个整数,720 和 60。将 720 乘以 100 并加上 60,得到 72060。按照百分之一的整数进行所有算术运算。要显示,打印 x/100 和 x%100,用小数点分隔,第二个数字打印为两位数,可能有前导零。

如果您更喜欢使用浮点类型,double 比 float 精确得多。最接近 720.60 的浮点数是 720.5999755859375。最接近的双精度为 720.6000000000000227373675443232059478759765625。如果仅打印小数点后两位数字,两者都会四舍五入为“720.60”,但在进行算术运算时会产生舍入误差。

于 2013-09-13T09:32:21.077 回答