所以我差不多在printf(3)
重新实现了C
(我不能使用任何可以转换的功能)。
现在我已经实现了所有转化,我看到了一些奇怪的东西,当我通过我的函数double
使用%g
时,100.10
然后va_arg
给了我100.09999999999999
,所以我的转换当然会给我一个100.099999
的字符串。
我像这样取双:
double d = (double)(va_arg(args, double));
我正在调用这两个函数:
double testd = 100.10;
my_printf("%g", testd); #=> 100.099999
printf("%g", testd); #=> 100.1
我认为我知道该值是错误的,因为在逐步执行该程序时,我看到double d = 100.09999999999999
。
我应该采用不同的方式吗?因为真正的printf似乎得到了正确的值。
编辑:
printf("%#.10g\n", testd); #=> 100.1000000000
这是由于四舍五入还是真正的printf
可能获得了良好的价值?
答案 0 :(得分:3)
只需添加格式说明符,printf
也许会显示相同的问题:
printf("%0.20g\n", d); // 100.09999999999999 on my system
原因是在我们的例子中,数字100.1
(因为大多数数字)没有精确的二进制表示。