.NETコードをJavaに翻訳していて、精度が不足していて問題が一致しませんでした。ゼロからの中点丸め.net C#十進数からJava double
.NETコード:上記のコードでroundToPrecision(8.7250, 0.05);
関数を呼び出す
private decimal roundToPrecision(decimal number, decimal roundPrecision)
{
if (roundPrecision == 0)
return number;
decimal numberDecimalMultiplier = Math.Round(number/roundPrecision, MidpointRounding.AwayFromZero);
return numberDecimalMultiplier * roundPrecision;
}
は私に期待されている8.75
を与えます。
Javaへの変換/変換は、次のとおりです。私は正確に
Math.Round
オプションを見つけることができません。
Javaコード:JavaコードでroundToPrecision(8.7250, 0.05);
を呼び出す
public double roundToPrecision(double number, double roundPrecision) {
if (roundPrecision == 0)
return number;
int len = Double.toString(roundPrecision).split("\\.")[1].length();
double divisor = 0d;
switch (len) {
case 1:
divisor = 10d;
break;
case 2:
divisor = 100d;
break;
case 3:
divisor = 1000d;
break;
case 4:
divisor = 10000d;
break;
}
double numberDecimalMultiplier = Math.round(number/roundPrecision);
double res = numberDecimalMultiplier * roundPrecision;
return Math.round(res * divisor)/divisor;
}
は私に8.7
を与え、これは正しくありません。
BigDecimal
でコードを修正しようとしましたが、ここでは参照番号C# Double Roundingを使ってJavaで次のように修正してみましたが、運はありません。
public double roundToPrecision(double number, double roundPrecision) {
if (roundPrecision == 0)
return number;
int len = Double.toString(roundPrecision).split("\\.")[1].length();
double divisor = 0d;
switch (len) {
case 1:
divisor = 10d;
break;
case 2:
divisor = 100d;
break;
case 3:
divisor = 1000d;
break;
case 4:
divisor = 10000d;
break;
}
BigDecimal b = new BigDecimal(number/roundPrecision);
b = b.setScale(len,BigDecimal.ROUND_UP);
double numberDecimalMultiplier = Math.round(b.doubleValue());
double res = numberDecimalMultiplier * roundPrecision;
return Math.round(res * divisor)/divisor;
}
私がこれを解決するために必要なものを教えてください。
ここに試してみるべきシナリオのいくつかがあります。
- 数字=
10.05
;精度=.1
;期待=10.1
; - 番号=
10.12
;精度=.01
;期待=10.12
; - 番号=
8.7250
;精度=0.05
;期待=8.75
; - 番号=
10.999
;精度=2
;期待=10
; - 番号=
6.174999999999999
;精度=0.05
;期待=6.20
;
注:私には60,000を超える数値があり、精度は小数点以下1桁から4桁まで変化します。 .NETの出力は、Javaと正確に一致する必要があります。
ありがとうございます。しかし、私はすでにこれを試しました。シナリオ1と2(私は質問を更新しました)を試してみてください。彼らはあなたの実装に期待される結果を与えません。 –
あなたのソリューションは 'java.lang.ArithmeticException:非終動小数点の展開をスローします。数値が10.0で精度が0.1の場合、BigDecimalの数値表現の正確な10進数の結果は表示されません。 –
例外をスローするときの引数は何ですか? – gunnerone