请尝试以下代码:
#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);
我愿意接受你的答案,我真的想了解这是如何运作的。为什么它适用于某些数字而其他人不会,为什么编译器在处理它的方式上有所不同,是否存在会影响编译器行为的编译器选项
答案 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);