为什么浮点数在C中得到舍入而在JavaScript或Python中没有?

时间:2017-03-27 14:00:56

标签: c

首先,我知道IEEE754标准下的浮点数对于十进制数是不准确的,我在JavaScript和Python中尝试0.3 - 0.2并且他们得到相同的0.09999999998,但我当我在C中尝试以下代码时得到0.1

float a = 0.3, b = 0.2, c = b - a;
printf("%f", c);

printf函数是否舍入了值?如果我想在C中打印十进制的不准确数字,我该怎么办?

2 个答案:

答案 0 :(得分:0)

你可以这样做:

printf("%0.3f", c)

答案 1 :(得分:0)

这里没有详细说明为什么与JavaScript或Python的区别。只是一些C细节。

在C中,"%f"的默认精度是.之后的6位小数。 @Jonathan Leffler

int main(void) {
  float a = 0.3, b = 0.2, c = b - a;

  printf("%f\n", c);
  // -0.100000

  // To show to 11 places, use, "%.11f".
  printf("%.11f\n", c);
  // -0.10000000894
  

如果我想在C中打印十进制的不准确数字,我该怎么办?

仅打印多个重要位数。

#include <float.h>
...
  printf("%.*e\n", FLT_DIG - 1, c);
  // -1.00000e-01

C详情:

变量c不准确,其值很准确,可能是-0.10000000894069671630859375。这是先前的操作,例如将0.3转换为float和减法是不准确的。

c打印指示printf()将舍入值打印为6,11或指定的任何位数。 printf()可以在{em>至少打印正确的文字,最多DBL_DIG(例如15)float/double的有效总数。

要打印典型的浮点值正好,请使用%a(十六进制)

printf("%a\n", c);
// -0x1.99999cp-4