BigDecimalの/倍精度 - 高アップ数ラウンド

jerry.pepper:

setYCoordinateにメソッド呼び出し以下の第二は、()、誤った値-89.99999435599995代わりに-89.99999435599994を取得します。

setXCoordinateの最初の呼び出しは、()正しい値29.99993874900002を取得します。

setXCoordinate(BigDecimal.valueOf(29.99993874900002))
setYCoordinate(BigDecimal.valueOf(-89.99999435599994))

私はBigDecimal.valueOf()内にブレークポイントを置く - このメソッドのコードルックス以下のように -

public static BigDecimal valueOf(double val) {
        // Reminder: a zero double returns '0.0', so we cannot fastpath
        // to use the constant ZERO.  This might be important enough to
        // justify a factory approach, a cache, or a few private
        // constants, later.
        return new BigDecimal(Double.toString(val));
    }

検査時にのvalueOfすなわち「ダブルヴァル」自体が受信した引数が-89.99999435599995です。どうして?私は私のMavenのpom.xmlで以下のようにJavaのバージョンが設定されています

<java.version>1.8</java.version>
ジェイコブG.:

のでdoubleそれほど精度を維持することはできません。あなたは使うべきではないdoubleのではなく、Stringあなたを初期化するときBigDecimal

new BigDecimal("29.99993874900002");
new BigDecimal("-89.99999435599994");

参照:浮動小数点演算が壊れていますか?

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=222580&siteId=1