我有下面的perl代码,想四舍五入我使用sprintf的最后一个diget,但是当最后一个摘要为5时我得到了一些奇怪的结果,我希望四舍五入是可以的,但是实际结果与下面的示例不同:
my $x = sprintf("%.1f",4.35); -> expected 4.4
my $y= sprintf("%.1f",4.36); -> expected 4.4
my $z = sprintf("%.1f",4.32); -> expected 4.3
print $x,"\n"; -> actual result 4.3 -> expected 4.4
print $y,"\n"; -> actual result 4.4 -> ok
print $z,"\n"; -> actual result 4.3 ->ok
我如何更改上面的代码/或者是否有其他选择来获得预期的结果?
4.35会四舍五入到4.4,但是实际上您的东西略小于4.35。
35/100是二进制的周期性,就像1/3是十进制的周期性一样。
$ perl -E'say sprintf "%.20g", 0.35'
0.34999999999999998
当然,同样适用于4 35/100。
$ perl -E'say sprintf "%.20g", 4.35'
4.3499999999999996
因此,不能使用浮点数精确表示0.35和4.35。
以下解决方案基于以下事实:0.5在二进制中不是周期性的(0.5 = 1/2 = 2 -1,2的幂的有限和):
$ perl -E'
say sprintf("%.0f", sprintf("%.15g", $_ * 10)) / 10
for 4.35, 4.36, 4.32;
'
4.4
4.4
4.3
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句