【问题标题】:How do I prevent float/double format specifier from automatically changing my decimal values in C?如何防止浮点/双精度格式说明符自动更改 C 中的十进制值?
【发布时间】:2013-09-13 08:16:09
【问题描述】:

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

sscanf("%f", &amount);

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

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

【问题讨论】:

标签: c floating-point formatting format-specifiers


【解决方案1】:

您可以打印更少的数字,或使用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)
  • 我知道。但是,由于某种原因,“.2f”的格式说明符不适用于 sscanf。我需要它从文件输入中扫描以读取到浮点变量中。有什么想法吗?
  • 您已经正确地读取了该值,并且精度与数据类型支持的一样高。你到底在问什么?
  • 从文件扫描时,我目前正在将其复制到浮点数中。当在计算中使用这个值时,我会得到大约 0.01 的差异,因为我需要将精度保持在两个十进制值。
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

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

    更多讨论请见this link。

    【讨论】:

      猜你喜欢
      • 2018-06-04
      • 1970-01-01
      • 2014-02-07
      • 1970-01-01
      • 2012-03-26
      • 1970-01-01
      • 1970-01-01
      • 2010-10-11
      相关资源
      最近更新 更多