gpt4 book ai didi

c - 不使用 %f 从 double 转换为 string 的舍入错误

转载 作者:太空宇宙 更新时间:2023-11-04 02:48:06 25 4
gpt4 key购买 nike

在这个问题之后:

If you dont have %f in C, how to write a C program to print decimal number upto 2 decimal places without %f?

这是我的尝试:

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

void dbl2str(char *s, double number, int decimals)
{
double integral, fractional;
int n, i;

fractional = modf(number, &integral);
n = sprintf(s, "%d%c", (int)integral, decimals ? '.' : 0);
for (i = 0; i < decimals; i++) {
fractional *= 10;
s[n + i] = '0' + (int)fractional;
fractional = modf(fractional, &integral);
}
s[n + i] = '\0';
}

int main(void)
{
char s[32];

dbl2str(s, 3.1416, 4);
printf("%s\n", s);
dbl2str(s, 3.159, 4);
printf("%s\n", s);
dbl2str(s, 3.04, 2);
printf("%s\n", s);
return 0;
}

输出:

3.1415
3.1589
3.04

如您所见,存在舍入误差,有没有办法获得正确的输出?

最佳答案

问题是 0.0006 不能用二进制精确表示,而是该表示将与 0.0005999 之类的东西完全匹配...这意味着当您将 10 乘以四次时,您的最后一位数字是 5 而不是 10。您需要查看序列中的下一个数字并适当舍入(在这种情况下,下一个数字将大于 5)。

四舍五入时要小心,因为将最后一位数字四舍五入可能会导致之前的数字也四舍五入(如果最后一位数字也是 9)。

关于c - 不使用 %f 从 double 转换为 string 的舍入错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25259288/

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