8
new BigDecimal("37146555.53880000").divide(new BigDecimal("1000000")).scale()

これは を返します10。しかし、API によると、divideメソッドは次のとおりです。

値が (this / divisor) で、優先スケールが (this.scale() - divisor.scale()) である BigDecimal を返します。

したがって、この場合、37146555.53880000'sスケールは8で、1000000のスケールは0です。したがって、結果のスケールは8ではなく になり10ます。

ここで何が欠けていますか?

ありがとう

4

3 に答える 3

7

実際の結果は 37.1465555388 であり、正確であるためには位取りを 10 にする必要があります。

JavaDoc が言っていることは、優先されるスケールは違いであり、結果が実際に 10 である必要がない場合、8 にしようとすることを意味します。たとえば、スケールも 0 である 2 で除算した場合、結果は 18573277.76940000 (スケール 8) になります。

編集:小さな追加 - オーバーロードされた除算メソッドを使用して、除算を特定のスケールに強制できます。

  • divide(BigDecimal, RoundingMode)結果が実際に正確であるためにさらに小数が必要な場合は、指定された丸め方法を使用して丸められたBigDecimalスケールと値が得られます。this

  • divide(BigDecimal, scale, RoundingMode)これにより、指定されたスケールが与えられ、BigDecimal必要に応じて指定された方法で丸められた値が得られます。

これは、既知の数値で除算すると 3 (1/3 = 0.333333...) のように小数が繰り返される可能性がある場合に役立ちます。これが発生した場合、単純な除算では例外がスローされるためです。小数点以下の最大数に制限すると、例外を回避するのに役立ちますが、計算の精度が低下します。

于 2010-07-21T20:33:32.723 に答える
1

これらのスケールは、正確な算術結果を返すメソッドによって使用されるスケールです。ただし、正確な結果にはより多くの桁が含まれる可能性があるため、正確な除算ではより大きなスケールを使用する必要がある場合があります。たとえば、1/32 は 0.03125 です。

于 2010-07-21T20:32:43.440 に答える
0

「間違いなくスケールになる」ではなく、「望ましいスケール」と書かれています。

絶対に確実にするために、私はBigDecimal.divide(BigDecimal, int, int).

于 2010-07-21T20:30:23.583 に答える