ウィキペディアによると、負の数を丸めるときは、絶対数を丸めます。そのため、-3.5 は -4 に丸められます。しかし、java.lang.Math.round(-3.5) を使用すると -3 が返されます。誰かがこれを説明できますか?
6 に答える
javadocによると
引数に最も近い long を返します。結果は、1/2 を加算し、結果の下限を取り、結果を long 型にキャストすることにより、整数に丸められます。つまり、結果は次の式の値と等しくなります。
(long)Math.floor(a + 0.5d)
概念的には、切り上げます。つまり、値よりも大きい次の整数に、-3 は -3.5 より大きく、-4 は小さいです。
丸めにはさまざまな方法があります。あなたが見ているものは、対称算術丸めと呼ばれています(それが述べているように)。あなたが参照しているセクションは、次のように述べています。これは、世界的に合意されたルールではなく、最も一般的なルールであることを認めているようです.
個人的には、学校でそのルールを教えられた記憶がありません。丸めに関する私の理解では、数値の符号に関係なく、.5 は常に切り上げられます。どうやら Java の作成者も同じ理解を持っています。これが非対称算術丸めです。
ツールや言語が異なれば、異なる丸めスキームが使用される可能性があります。Excelは明らかに対称法を使用しています。
(全体として、ウィキペディアと経験との間に矛盾がある場合は、別の場所で情報を探すことをお勧めします。ウィキペディアは完璧ではありません。)
その価値があるのは、java.math.BigDecimal
そのようなことをより細かく制御する必要がある場合に選択可能な丸めモードがあります。
あなたが引用したウィキペディアの記事は、それが唯一の丸め方法であるとは言っていません。丸めの一般的な方法です。その記事では、いくつかの代替手段についても言及されています (残念ながら、Java の丸め方法について説明しているものはありません。JavaScript の機能を示すときに「非対称算術丸め」と呼んでいますが)。
数値を丸める方法を決定し、その方法を使用する必要があります。Java の実装がそれに一致する場合は、すばらしいことです。それ以外の場合は、独自に実装する必要があります。
Javadocs によると:
long
引数に最も近いものを返します。結果は、1/2 を加算し、結果の下限を取り、結果を type にキャストすることにより、整数に丸められlong
ます。つまり、結果は次の式の値と等しくなります。
(long)Math.floor(a + 0.5d)
規則は切り上げることであることが判明しました。ウィキペディアは間違いやすいと思います。ただし、Microsoft はそれを間違っており、-4 に四捨五入しており、これは規則ではありません (数学の博士号を持っている人に確認しました)。