浮点表示问题

时间:2015-12-09 19:38:59

标签: c floating-point

请尝试以下代码:

#include <stdio.h>

unsigned char TEST_COMPILER_AS13 = 1.18 * 100;

int main(void) {
    printf("%d" , TEST_COMPILER_AS13);
    // your code goes here
    return 0;
}

使用C. https://www.codechef.com/ide

结果将是117

如果我们用1.17替换1.18,结果将是116,但如果我们使用1.19,1.20,1.15等,结果将是正确的119,120,115。

使用不同的在线编译器说:http://codepad.org/ 1.18和1.17的结果将是合适的 然而,如果你尝试1.13,1.14,1.15,它将分别为112,113,114

我在摸我的脑袋,我无法理解为什么会这样。 注意: 我尝试过不同的编译器DIAB,COSMIC,MinGw等 都有类似的问题。所以我在这里缺少什么,或者浮点运算是如何完成的。

注意: 要解决此问题,您可以使用float转换操作 所以声明如下:

unsigned char TEST_COMPILER_AS13 = (float) (1.18 * 100);

我愿意接受你的答案,我真的想了解这是如何运作的。为什么它适用于某些数字而其他人不会,为什么编译器在处理它的方式上有所不同,是否存在会影响编译器行为的编译器选项

1 个答案:

答案 0 :(得分:-1)

你拥有它的方式,浮点值被截断为整数类型(unsigned char)。要舍入到最近,请改用它。

unsigned char TEST_COMPILER_AS13 = 1.18 * 100 + 0.5;

虽然这可能&#34;修复&#34;对于这种特殊情况,浮点计算总会存在精度问题。请参阅@JohnnyMopp在评论中发布的链接。

<小时/> [编辑]看看特定编译器&#34;认为&#34; 1.18 * 100是,您可以将其打印到完全精确度(double的情况下最多17个有效小数位数。)

printf("%.16f * 100 = %.16f\n", 1.18, 1.18 * 100);