gpt4 book ai didi

c - sprintf 缩放整数。 123 打印为 12,3

转载 作者:行者123 更新时间:2023-11-30 21:22:29 24 4
gpt4 key购买 nike

我有一个整数,代表十分之一。有没有一种快速方法可以在最后一位数字前添加小数点,而不是除以 10,从而引入舍入误差(并浪费时间)?

一些魔法,比如

snprintf(dest,len,"%d4.-1", 123) resulting in 12.3

原因是为了避免舍入错误,例如在货币方面,金额在内部计算为整数美分,而不是英镑、欧元或美元的小数。

如果我没记错我的 COBOL,这里可以指定像 9,990.00 这样的格式,这使得 1234 打印为 12.34,1 打印为 0.01。

void setup() {
Serial.begin(115200);
delay(1000);
uint16_t i16 = 0;
float f = 998;
for (i16 = 998; i16 < 1011; i16++) {
Serial.print(i16 / 1000);
Serial.print(" ");
Serial.print(f / 1000);
Serial.printf(" %0.3f %0.3f %0.7f\n",i16/1000,f/1000,f/1000);
f = f + 1;
}
}

int/10 仍然是 int,所以 123/10 = 12。

奇怪的是fprint("%0.2f",123/10)打印0.00


0 1.00 0.000 0.998 0.9980000
0 1.00 0.000 0.999 0.9990000
1 1.00 0.000 1.000 1.0000000
1 1.00 0.000 1.001 1.0010000
1 1.00 0.000 1.002 1.0020000
1 1.00 0.000 1.003 1.0030000
1 1.00 0.000 1.004 1.0039999 <--- Rounding error
1 1.00 0.000 1.005 1.0050000
1 1.01 0.000 1.006 1.0060000
1 1.01 0.000 1.007 1.0070000
1 1.01 0.000 1.008 1.0080000
1 1.01 0.000 1.009 1.0089999 <--- Rounding error
1 1.01 0.000 1.010 1.0100000

a %0.6f 不会产生舍入误差,但 %0.7f 会产生舍入误差。

因此,对于小数整数,最好采用移入小数点的整数格式。

使用浮标有时会产生一些有趣的结果,就在昨天,我看到“水位预计将上升 10.000000002 到 12 英尺”。

最佳答案

确保dest中有足够的空间!

int n = snprintf(dest, len, "%d", 123);
dest[n + 1] = 0;
dest[n] = dest[n - 1];
dest[n - 1] = '.';

或者,保存一行代码(感谢@bruno)

int n = snprintf(dest, len, "%d#", 123);
dest[n - 1] = dest[n - 2];
dest[n - 2] = '.';

关于c - sprintf 缩放整数。 123 打印为 12,3,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54008315/

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