プロが教えるわが家の防犯対策術!

Perlで sprintf("%.3f", "19.9996")とすると、
勝手に四捨五入されて、 20.000となります。
私が求めたい値は19.999です。
この場合はどのように記述したら良いのでしょうか?

A 回答 (5件)

1000倍して整数部分での切り捨てを行うのがわかりやすい実装では。



$value = "19.9996";
$value_int = int( $value * 1000 ); # 100倍して整数に。負の値を扱う時はint関数は不適当かもしれません。注意。
$output1 = substr( $value_int, 0, -3 ); # 整数部
$output2 = substr( $value_int, -3 ); # 小数部
print "$output1.$output2";

厳密な精度を要求する丸め動作は Perl が使用するシステム丸めを信用せず、代わりに自分自身で丸め関数を実装するべきです、とマニュアルにも書かれています。
    • good
    • 0

皆さんのすばらしい回答もありますが、参考までにこんなやり方もあるんだ程度に思って貰えれば幸いです。



print &round(19.9996,3);

sub round{
my($rit);

if($_[0]=~/\./){
my($n,@a,@b);
@a=split(/\./,$_[0]);
@b=split(//,pop(@a));
push(@a,".");
for($n=0;$n<$_[1];$n++){
push(@a,$b[$n]);
}
$rit=join("",@a);
}else{$rit=$_[0];}

return $rit;
}

自作関数roundは(数字,少数点以下の桁数)を渡すと、自動的に余分な部分を切り落として、返すものです。
基本的な考え方は、整数値と小数点値に切り分けて、(配列に消えた.を入れて)小数点値を前から指定数分だけ取り出し、配列に入れて最後にドッキングさせています。
自分の求める関数がないなら無理矢理関数を作ってしまうのも手です。
本当に処理も多く、全くオススメできないソースですが、こういうやり方もあります。
    • good
    • 0

$i = 19.9996;


$i -= 0.0005;
sprintf("%.3f", $i);

というのはどうでしょうか。
    • good
    • 0

#1です


$a=sprintf("%.4d",$i);

$a=sprintf("%.4f",$i);
です。
bazaxさん、このやり方は嫌いなんですよね?
    • good
    • 0

$i=19.9996;


@a={"0","0",".","0","0","0","0"};

$a=sprintf("%.4d",$i);
$a=substr($a,0,5);
print("$a\n");
なら出来るのですが、
エスケープシーケンスで切捨ては出来たかな・・・?
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!