【问题标题】:Rounding floating equal to 5 [duplicate]舍入浮点数等于 5 [重复]
【发布时间】:2021-04-06 10:07:52
【问题描述】:
$a = 13.485;
$b = 13.255;
printf '%.2f -- %.2f', $a, $b;

13.48 -- 13.26

但我需要

13.49 -- 13.26

什么是最好的方法总是从第 5 轮到第 5 轮?

【问题讨论】:

  • $a 可能包含基数为 2 的 13.4849999999999994315658113919198513031005859375 或 1101.0111110000101000111101011100001010001111010111,而不是精确的 13.485(假设双精度 IEEE754 数字)。所以13.48 比13.49 更接近。

标签: perl floating-point rounding


【解决方案1】:

485/1000 是二进制的周期数(就像十进制的 1/3)。

                ____________________
485/1000 = 0.01111100001010001111010

因此,它不能准确地表示为浮点数。 (这将需要无限存储。)您实际拥有的数字略小于 13.485。

$ perl -E'say sprintf "%.100g", 13.485'
13.4849999999999994315658113919198513031005859375

由于 13.4849... 比 13.49 更接近 13.48,所以它四舍五入到 13.48。


相反,您拥有的数字不是 13.255,而是略大于 13.255。

$ perl -E'say sprintf "%.100g", 13.255'
13.2550000000000007815970093361102044582366943359375

所以这恰好按需要产生 13.26。


如果这对您很重要,也许您不应该使用浮点数。

【讨论】:

    【解决方案2】:
    use Math::Round 'round';
    
    my $number = 13.485;
    my $rounded = round($scalar * 100) / 100;
    # rounded == 13.49
    

    警告:这种方法只有 0.5 一半的时间。也就是说,它将正数向上舍入。 Math::Round::round() 将 -3.5 舍入到 -4,这是向下的,而不是向上的。不过,这可能就是您的意思。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-25
      • 2023-03-05
      • 1970-01-01
      • 1970-01-01
      • 2020-06-09
      相关资源
      最近更新 更多