ヽ|∵|ゝ(Fantom) の 開発blog? ホーム » プログラミング »Java, C#, PHP, Ruby, Python, JavaScript での Math.round(四捨五入・五捨六入)比較

Java, C#, PHP, Ruby, Python, JavaScript での Math.round(四捨五入・五捨六入)比較  


 先日、言語間で算術関数を含む移植などしてたら、結果が違ってたので改めて調べてみた。「負の値の割り算や剰余」なんかもそうだけど、言語仕様によって値が違ってたりするので、毎回確認するのは面倒なんだよね。せっかくなので、一覧にしていつでも見れるようにしておこうと考えた。


(元の値)
JavaJavaScriptC#Python3RubyPHP
Math.roundMath.roundMath.Roundroundroundround
-2.0-2-2-2-2-2-2
-1.6-2-2-2-2-2-2
-1.5-1-1-2-2-2-2
-1.4-1-1-1-1-1-1
-1.0-1-1-1-1-1-1
-0.6-1-1-1-1-1-1
-0.5 0 0 0 0-1-1
-0.4 0 0 0 0 0 0
0.0 0 0 0 0 0 0
0.4 0 0 0 0 0 0
0.5 1 1 0 0 1 1
0.6 1 1 1 1 1 1
1.0 1 1 1 1 1 1
1.4 1 1 1 1 1 1
1.5 2 2 2 2 2 2
1.6 2 2 2 2 2 2
2.0 2 2 2 2 2 2


 実際の結果は以下の通り。paiza.io で比較した。

Java, C#, PHP でのRound結果
Java, C#, PHP
Ruby, Python, JavaScript でのRound結果
Ruby, Python, JavaScript
(クリックで拡大)

 言語によっては丸め方法のオプションなんかもあるが、そのまま使ってると四捨五入っぽかったり、五捨六入っぽかったり、0からの距離っぽかったり、値の境界が異なるので、複数の言語を使うときには気をつけた方が良いだろう。

 どうしても揃えたければ

 floor(v + 0.5)

のようにする手もある。

 また、「0からの距離でグループ分け」と「等間隔にグループ分け」で使い分けをすることもできるので、知っておいても損はないだろう。

「0からの距離でグループ分け」と「等間隔にグループ分け」
(クリックで拡大)


 まぁ、何にしても、「負の値の演算」「丸め誤差を持つ演算」「0をまたぐ演算」あたりは仕様を確認しておいた方が良いだろう。


(関連記事)
【C#】倍数での Floor, Ceil, Round(一定間隔での切り捨て、切り上げ、四捨五入) [double 版]
【Unity】倍数での Floor, Ceil, Round(一定間隔での切り捨て、切り上げ、四捨五入) [float 版]
【Java】Math.floor(), ceil(), round() 動作互換アルゴリズムを試す



スポンサーサイト

category: プログラミング

thread: プログラミング

janre: コンピュータ

tag: Java  C#  PHP  Ruby  Python  JavaScript 
tb: 0   cm: --


トラックバック

トラックバックURL
→http://fantom1x.blog130.fc2.com/tb.php/245-e4c7873c
この記事にトラックバックする(FC2ブログユーザー)

プロフィール

検索フォーム

全記事一覧

カテゴリ

ユーザータグ

最新記事

リンク

PR

▲ Pagetop