【发布时间】:2013-09-13 08:16:09
【问题描述】:
我有一个奇怪的问题,如果我输入 720.60 到
sscanf("%f", &amount);
如果 amount 是 float 类型,变量中的值将更改为 720.59967。
我怎样才能绕过它并防止它改变我的价值?
【问题讨论】:
标签: c floating-point formatting format-specifiers
我有一个奇怪的问题,如果我输入 720.60 到
sscanf("%f", &amount);
如果 amount 是 float 类型,变量中的值将更改为 720.59967。
我怎样才能绕过它并防止它改变我的价值?
【问题讨论】:
标签: c floating-point formatting format-specifiers
您可以打印更少的数字,或使用double。 single precision IEEE-754 float 值具有 23 位尾数,这意味着它具有大约 7 个十进制数字的精度。您看到的值已尽可能接近:没有比 720.59967 更接近 720.60 的 float 值。
实际上,最接近720.60的两个float值的确切值是:
720.5999755859375 (slightly less than 720.60)
720.60003662109375 (slightly more than 720.60)
【讨论】:
printf(".2f", amount)
如果您需要小数点后的固定位数,例如 2,则可以使用浮点数。
在“.”处拆分输入字符串,并将“720.60”视为两个整数,720 和 60。将 720 乘以 100 并加上 60,得到 72060。所有的算术运算都以百分之一的整数表示。要显示,打印 x/100 和 x%100,用小数点分隔,第二个数字打印为两位数,可能有前导零。
如果您更喜欢使用浮点类型,double 比 float 精确得多。最接近 720.60 的浮点数是 720.5999755859375。最接近的双精度为 720.6000000000000227373675443232059478759765625。如果仅打印小数点后两位数字,两者都会四舍五入为“720.60”,但在进行算术运算时会产生舍入误差。
【讨论】:
你不能那样做。这是精度问题,即 C 中使用的浮点格式不能准确表示 720.60。您可以尝试为amount 输入double,这将提高您的精度,但您仍然无法获得准确的值。
更多讨论请见this link。
【讨论】: