我有一个奇怪的问题,如果我输入 720.60 到
sscanf("%f", &amount);
其中 amount 是 float 类型,变量中的值更改为 720.59967。
我怎样才能绕过它并防止它改变我的价值?
我有一个奇怪的问题,如果我输入 720.60 到
sscanf("%f", &amount);
其中 amount 是 float 类型,变量中的值更改为 720.59967。
我怎样才能绕过它并防止它改变我的价值?
您可以打印更少的数字,或使用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)
你不能这样做。这是精度问题,即C 中使用的浮点格式不能准确表示720.60。您可以尝试double
输入 for amount
,这将提高您的精度,但您仍然无法获得准确的值。
有关更多讨论,请参见此链接。
如果您需要小数点后的固定位数,例如 2,则可以使用浮点数。
在“.”处拆分输入字符串,并将“720.60”视为两个整数,720 和 60。将 720 乘以 100 并加上 60,得到 72060。按照百分之一的整数进行所有算术运算。要显示,打印 x/100 和 x%100,用小数点分隔,第二个数字打印为两位数,可能有前导零。
如果您更喜欢使用浮点类型,double 比 float 精确得多。最接近 720.60 的浮点数是 720.5999755859375。最接近的双精度为 720.6000000000000227373675443232059478759765625。如果仅打印小数点后两位数字,两者都会四舍五入为“720.60”,但在进行算术运算时会产生舍入误差。