gpt4 book ai didi

c - 为什么 roundf() 不舍入 float 值,为什么 int - float 数学运算返回错误值?

转载 作者:太空狗 更新时间:2023-10-29 16:10:43 25 4
gpt4 key购买 nike

我不明白为什么 math.h 中的 roundf() 函数不舍入 donation 变量,而它舍入livestockPM 没有问题。我需要使用舍入值进行其他计算,但我正在使用 printf 检查值是否正确,它只是返回错误值(不舍入变量 donation)。此外,变量 final 只返回四舍五入到 .00 的值,与变量 farmer1,2,3 保持什么无关。

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

int main(){
int farmer1 = 9940;
int farmer2 = 4241;
int farmer3 = 7779;

float livestockPM = (float)farmer1 / (float)farmer2;
printf("livestock: %f\n",livestockPM);

livestockPM = roundf(livestockPM * 100) / 100;
printf("livestock rounded: %f\n",livestockPM);

float donation = (float)livestockPM * (float)farmer3;
printf("donation: %f\n", donation);

donation = roundf(donation * 100.00) / 100.00;
printf("donation rounded: %f\n", donation);

float final = donation * (float)farmer2;
printf("final: %f\n", final);

return 0;
}

输出:

livestock: 2.343787
livestock rounded: 2.340000
donation: 18202.859375
donation rounded: 18202.859375
final: 77198328.000000

有人知道为什么吗?我在想是因为将 float 与 int 相乘,但我似乎无法让它像这样工作。我试过从整数变量中删除 (float),但结果也不理想。谢谢。

最佳答案

OP 的float 是使用二进制 float 编码的,18202.859375 缺乏精度,无法采用"%f" 打印为 18202.860000

float 不能表示所有可能的数字。作为二进制 float ,它可以表示如下数字。参见 IEEE 754 Converter ,但不介于两者之间。

18202.859375
18202.86138125

当执行以下代码时,最好的结果仍然是 18202.859375

float donation_rounded = roundf(18202.859375 * 100.00) / 100.00;

回想一下,printf("%f\n", x) 打印了一个四舍五入到最接近 0.000001 值的数字。

代码可以使用double,但是对于非常大的数字也会出现同样的问题,但可能会满足 OP 的即时需求。 @user3386109


由于 OP 似乎在努力应对金钱,标准 C 中没有伟大解决方案。best money/currency representation涉及一些问题。

关于c - 为什么 roundf() 不舍入 float 值,为什么 int - float 数学运算返回错误值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40943115/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com