1

浮動小数点数が原因で、Perl (v5.10.1) での計算に問題があります。

#!/usr/bin/perl
use strict;
use warnings;
use POSIX;

my $x1 = 1500;
my $x0 = 1000;
my $dx = 100/3;

print "($x1-$x0)/$dx \n";                                   #(1500-1000)/33.3333333333333
print my $a=(($x1-$x0)/$dx), "\n";                          #15
print my $b=floor(($x1-$x0)/$dx), "\n";                     #14
print my $c=floor($a), "\n";                                #14
print floor(15), "\n";                                      #15
print my $d=floor(sprintf("%.0f", ($x1-$x0)/$dx)), "\n";    #15

出力が 14 になることがあるのはなぜですか? に示されているように値 15 が保存されている$aので、値 15 で使用さfloorれていませんか? と の比較は$a$c私を本当に困惑させます...

これを読んだのですが、よくわかりません。sprintfまた、私の意見ではあまり便利ではない回避策も見つけました。

4

2 に答える 2

2

倍精度では、$dx の値は正確に

33.3333333333333570180911920033395290374755859375

($x1-$x0)/$dx の値は正確に

14.9999999999999982236431605997495353221893310546875

したがって、floor($x1-$x0)/$dx は 14 です。

print/sprintf から 15 を取得するのは、印刷では 10 進数の値が四捨五入されるためです ("%.17g" のようにそれ以上の桁数を要求しない限り)。

于 2013-11-05T02:32:26.010 に答える