关于float的舍入和转换成int的问题,我面临着一个非常奇怪的事实。
如本文所述:
http://www.gnu.org/software/libc/manual/html_node/Rounding.html
舍入到最接近的可表示值是默认舍入模式。但似乎不是。
所以我创建了一个简单的程序:

#include <fenv.h>
#include <stdio.h>

int a;
double b;

main() {
  b=1.3; a=b; printf("%f %d\n",b,a);
  b=1.8; a=b; printf("%f %d\n",b,a);
  b=-1.3; a=b; printf("%f %d\n",b,a);
  b=-1.8; a=b; printf("%f %d\n",b,a);
  printf("%d %d %d\n",fegetround(),FE_TONEAREST,FE_TOWARDZERO);
}

程序是用gcc-4.7(debian)、cygwingcc和Visual studio编译的。输出相同,只有FE_TOWARDZERO的定义改变。
程序输出:
 1.300000 1
 1.800000 1
-1.300000 -1
-1.800000 -1
0 0 3072

因此,我们可以清楚地看到,在所有测试的编译器中,舍入模式都设置为FE_TONEAREST(默认值),但它们都是向零舍入的。
为什么?
PS:是的,我可以使用Math.round(),但我想知道为什么会发生这种情况。

最佳答案

因为舍入模式适用于浮点舍入函数。转换为int总是截断。

07-24 18:23
查看更多