使用sprintf舍入浮点数

用户名

我有下面的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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用AWK舍入浮点数

来自分类Dev

IEEE浮点数舍入

来自分类Dev

如何使用C ++在OpenCV中舍入浮点数

来自分类Dev

MySQL浮点数被意外舍入

来自分类Dev

在csh中舍入浮点数

来自分类Dev

Javascript:舍入浮点数问题

来自分类Dev

在字典中舍入浮点数

来自分类Dev

fscanf() 在 C 中舍入浮点数

来自分类Dev

如何使用sprintf输出小于1且没有前导小数位的浮点数?

来自分类Dev

如何为浮点数指定舍入模式?

来自分类Dev

IEEE754浮点数最通用的舍入算法

来自分类Dev

在MySQL中舍入浮点数而不是整数

来自分类Dev

浮点数转换为整数时如何舍入

来自分类Dev

将指数浮点数舍入到2位小数

来自分类Dev

如何舍入嵌套元组列表中的每个浮点数

来自分类Dev

PostScript:修复浮点数中的舍入错误

来自分类Dev

将浮点数舍入为Haskell中的int

来自分类Dev

如何将浮点数舍入为缩放的整数?

来自分类Dev

在MySQL中舍入浮点数而不是整数

来自分类Dev

将浮点数舍入为Haskell中的int

来自分类Dev

为什么在舍入浮点数时python返回0?

来自分类Dev

IEEE754浮点数最通用的舍入算法

来自分类Dev

将浮点数舍入为 -1、0 或 1

来自分类Dev

将大浮点数舍入为整数

来自分类Dev

如何在 PHP 中舍入浮点数?

来自分类Dev

XSLT:如何舍入属性中的浮点数列表?

来自分类Dev

如何使用清除浮点数?

来自分类Dev

如何使用双浮点数?

来自分类Dev

使用awk减去浮点数