あなたはに四捨五入されていない2.999....
前に、デフォルトの小数点以下の桁数よりも多くを必要とする3
試してみてください。
$ perl -e 'print int(2.999)."\n"'
2
:
$ perl -e 'printf "%.17f\n",log(1000)/log(10)'
2.99999999999999956
そしてint
がフロートの床であります
フローティング部分と整数部分を処理する標準的な方法浮動小数点数はPOSIXモジュールに含まれています。
あなたはmodf
と整数部とフロート部を分離することができます:
$ perl -MPOSIX -e '($fp, $ip)=modf(3.14); print "$fp $ip\n"'
0.14 3
それとも、あなたのケースで:
$ perl -MPOSIX -e '($fp, $ip)=modf(log(1000)/log(10)); printf "%.17f %i\n",$fp,$ip '
0.99999999999999956 2
ます。また、標準のためceil
、floor
、fxexp
、およびround
を使用することができますこれらの関数のバージョンlog
であるため、
$ perl -MPOSIX -e 'use bigint; ($fp, $ip)=modf(log(1000)/log(10)); printf "%.45f %i\n",$fp,$ip'
0.000000000000000000000000000000000000000000000 3
または:プラグマとして、
$ perl -Mbignum -e 'printf "%.30f\n",log(1000)/log(10)'
3.000000000000000000000000000000
または:精度は、あなたの懸念は、ある
場合は潜在的に簡単に部分的な修正はbignumライブラリを使用することですtranscendental functionには、シンボリック数学パッケージを使用します。
['int'](http://perldoc.perl.org/functions/int.html)は丸められません。 'sprintf"%.N "、$ float'(または' printf')を使うことができます – zdim
はい、どうすれば問題を解決できますか? POSIX :: float()は丸めて同じ結果を返します。 – PeterT
あなたが探している出力と動作は何ですか? – dawg