3

関数 round を書いています: static float round(float number, precision){}

関数は次のように動作するはずです: round(12.3456f, 3) = 12.345

関数の私の定義は次のようになります。

public static float round(float value, int precision) {
float result;
if(precision <= 0){
    throw new RuntimeException("Precision can not be zero or less");
}

int number = (int) power(10,precision);
value = value * number;
result = (float)Math.round(value)/number;

return result;
} 

しかし、問題は、この関数の単体テスト ケースがパスしないことです。

 public void mathTestNew() {
    assertEquals("MathTest",12.341,OOTBFunctions.round(12.3416f,3));
 }

結果は junit.framework.AssertionFailedError: MathTest expected:<12.341> but was:<12.342> です。

このエラーを克服する方法がわかりません。BigDecimal がこれに役立つかどうかはわかりません。

4

5 に答える 5

4

丸めは通常、最も近い整数に向かって行われます。したがって12.3416正しく丸められます12.342

求めていると思われる丸め動作 (数値が負の無限大に向かって切り捨てられる) が必要な場合は、Math.round(x)の代わりに Math.floor(x ) を使用する必要があります。

また、float / double の丸めには注意してください。どちらも数値が不正確になるためです。小数点以下の精度が本当に必要な場合は、代わりにBigDecimalを使用することをお勧めします。

于 2012-05-29T23:42:30.647 に答える
3

Math.round「最も近いものへの丸め」です。あなたはおそらくしたいですMath.floor

于 2012-05-29T23:40:52.283 に答える
2

使用したい場合BigDecimal

public static float round(float value, int precision) {
    if (precision <= 0) {
        throw new IllegalArgumentException("Precision cannot be zero or less.");
    }
    BigDecimal decimal = BigDecimal.valueOf(value);
    return decimal.setScale(precision, RoundingMode.FLOOR).floatValue();
}

BigDecimalからに変換すると精度が失われる可能float性があるため、精度が必要な場合は変換しないでください。として値を保持しますBigDecimal

他の回答で述べたように、float10 進数の近似値です。以下はまさにそれを示しています。

System.out.println(BigDecimal.valueOf(12.3416f)); // outputs 12.34160041809082
System.out.println(new BigDecimal("12.3416"));    // outputs 12.3416
于 2012-05-29T23:52:08.467 に答える
1

12.3416丸みがございます12.342。そこにあなたの問題があります。Math.Floorおそらく代わりに欲しいでしょう。数を台無しにする可能性があるため、常に乗算しないことをお勧めします。ただし、10 を加えても精度は低下しません。

于 2012-05-29T23:41:01.713 に答える
0

そのようなメソッドを書くことはできません。浮動小数点には小数点以下の桁数がなく、2 進数の桁数があります。したがって、指定した小数点以下の桁数に丸めることはできません。小数位が必要な場合は、小数基数、つまり BigDecimal または DecimalFormat を使用する必要があります。@ColeJohnson が指摘した期待のエラーとは別に、あなたが書いたようなコードは 90% 以上のケースで失敗します。

于 2012-05-29T23:42:03.843 に答える