C中的四舍五入(math.h)不能正常工作 #包括 #包括 int main(){ printf(“6*0.95*0.25的四舍五入值=%.2f\n”,四舍五入(6*0.95*0.25*100)/100); printf(“1.425的四舍五入值=%.2f\n”,四舍五入(1.425*100)/100); }

C中的四舍五入(math.h)不能正常工作 #包括 #包括 int main(){ printf(“6*0.95*0.25的四舍五入值=%.2f\n”,四舍五入(6*0.95*0.25*100)/100); printf(“1.425的四舍五入值=%.2f\n”,四舍五入(1.425*100)/100); },c,math.h,C,Math.h,我怀疑这与双精度和相应算法的准确性有关,但我不知道如何解决这个问题(例如6*0.95*0.25,即1.425,将四舍五入为1.43) (我正在使用GNU编译器的最新版本(1.7左右)) 感谢您的帮助 我正设法调到下午2点 以下是输出: 舍入值6*0.95*0.25=1.42 四舍五入值1.425=1.43 () 我想要 舍入值6*0.95*0.25=1.43 数学中的四舍五入值1.425=1.43。h的工作原理与它应该的完全一样。当你给你的程序一个像1.425这样的十进制数时,它会将其存储为这个

我怀疑这与双精度和相应算法的准确性有关,但我不知道如何解决这个问题(例如6*0.95*0.25,即1.425,将四舍五入为1.43)

(我正在使用GNU编译器的最新版本(1.7左右))

感谢您的帮助

我正设法调到下午2点

以下是输出:

舍入值6*0.95*0.25=1.42
四舍五入值1.425=1.43

()

我想要

舍入值6*0.95*0.25=1.43

数学中的四舍五入值1.425=1.43。h的工作原理与它应该的完全一样。当你给你的程序一个像1.425这样的十进制数时,它会将其存储为这个数的最接近的二进制表示形式。数字1.425=57/40。因为40不是2的幂,所以这个数字没有精确的二进制表示。在这种情况下,存储的数字略小于1.425,因此数字向下舍入


阻止这种舍入差异的唯一通用解决方案是使用十进制浮点实现。除非硬件支持,否则这将比二进制浮点实现慢得多

我的解决方案是实现以下功能:

#include <stdio.h>
#include <math.h>

int main(){
  printf("Rounded value of 6*0.95*0.25 = %.2f\n", round(6*0.95*0.25*100)/100);
  printf("Rounded value of 1.425 = %.2f\n", round(1.425*100)/100);
}
这似乎有效

double twoDPRoundHack(double x){
  return round(round(x*10000)/100)/100;
}
#包括
#包括
double twoDPRoundHack(双x){
返回轮(轮(x*1000)/100)/100;
}
int main(){
printf(“6*0.95*0.25的四舍五入值=%.2f\n”,
twoDPRoundHack(6*0.95*0.25*100);
printf(“1.425的四舍五入值=%.2f\n”,四舍五入(1.425*100)/100);
}

显然,它被存储为142.4999999999…

如果您在打印语句外进行计算,您将得到正确的答案

#include <stdio.h>
#include <math.h>

double twoDPRoundHack(double x){
  return round(round(x*1000)/100)/100;
}

int main(){
  printf("Rounded value of 6*0.95*0.25 = %.2f\n", 
         twoDPRoundHack(6*0.95*0.25*100));
   printf("Rounded value of 1.425 = %.2f\n", round(1.425*100)/100);
}

这显然不像预期的那样有效。我不知道这是否有多大帮助,但改变乘法的顺序似乎可以解决这个问题

Rounded value of 6*0.95*0.25 = 1.43
Rounded value of 1.425 = 1.43 

这显然是超级愚蠢!也许这其中有一条线索可以找到问题的原因。

什么不起作用?您得到的输出是什么?您期望的输出是什么?默认情况下,如果值在中间,round函数将对其进行取整。但是,您可以通过向构造函数发送另一个布尔值来指定它。第一个值是将
142.5
四舍五入到
142
。更改为
printf(“舍入值6*0.95*0.25=%.2f\n”,舍入(6*0.95*0.25*1000)/1000)提供您想要的输出。。。。。。对于这个特定的实例。@BurnsBA这是一个可以工作的真值,但在较大的程序中,我将舍入值分配给另一个变量,我希望将值舍入到2 d.p。存储在内存中。有人不同意:OP的问题不是1.425附近的值,而是1.43附近的值。OP的代码计算
6*0.95*0.25
,该值为143.0或至少接近143.0。即使它有点像143.0001。。。或142.9999…,
四舍五入(6*0.95*0.25*100)
的结果为143.0-精确。然后
轮(6*0.95*0.25*100)/100将接近1.43。除非编译器向0四舍五入,而不是向最近值四舍五入,否则应打印
“1.43”
@chux如果OP只需要有关此精确计算的信息,则正确答案为
printf(“1.43”)。您建议的计算
6*0.95*0.25*100
142.499…
到更接近142的计算机<代码>圆形(6*0.95*0.25*100)
=142,试试看。另外,我通过编写一个Swift程序进行检查,然后通过在C中尝试进行双重检查。FWIW,在某些情况下,您还可以使用带有适当乘法器的整数进行算术运算,然后插入点进行显示。这种习惯用法(
round(x*100)/100
)与您可能想象的不同。看见
Rounded value of 6*0.95*0.25 = 1.43
Rounded value of 1.425 = 1.43 
#include <stdio.h>
#include <math.h>

int main(){
  printf("Rounded value of 6*0.95*0.25 (hundred last) = %.2f\n", round(6*0.95*0.25*100)/100);
  printf("Rounded value of 6*0.95*0.25 (hundred first) = %.2f\n", round(100*6*0.95*0.25)/100);
  printf("Rounded value of 1.425 = %.2f\n", round(100*1.425)/100);
}
Rounded value of 6*0.95*0.25 (hundred last) = 1.42
Rounded value of 6*0.95*0.25 (hundred first) = 1.43
Rounded value of 1.425 = 1.43