由於項目使用到 BigDecimal.ROUND_DOWN 接近零的舍入模式 ,沒想到有一個 使用的坑。 下面來例子說明:code
String add = "67.80"; System.out.println(add.toString()); BigDecimal t = new BigDecimal(Double.valueOf(add)); System.out.println(t.toString());// 67.7999999999999971578290569595992565155029296875 System.out.println(t.setScale(2, BigDecimal.ROUND_DOWN));// 67.79 System.out.println(t.setScale(2, BigDecimal.ROUND_HALF_UP));// 67.80
能夠看到 , 若是 BigDecimal 是由 double 來構造的,那麼 使用 ROUND_DOWN 的時候,有時候會 發現 比實際的 值會小一點, 這就坑大了。 除非 是 值的小數點要比 直接 的小數位 多一些。 好比 String add = "67.802"; 這樣的, 就能夠。ci
若是是 使用 String 類型的就沒有這樣的問題。方法
String add = "67.80"; System.out.println(add); BigDecimal t = new BigDecimal(add); System.out.println(t.toString());// 67.80 System.out.println(t.setScale(2, BigDecimal.ROUND_DOWN));// 67.79 System.out.println(t.setScale(2, BigDecimal.ROUND_HALF_UP));// 67.80
若是要避免的話 double , 可使用 Double.toString() 方法來構造 BigDecimalim
String add = "67.80"; System.out.println(add.toString()); BigDecimal t = new BigDecimal(Double.toString(new Double(add))); System.out.println(t.toString());// 67.80 System.out.println(t.setScale(2, BigDecimal.ROUND_DOWN));// 67.80
BigDecimal 的問題的,避免不了,只能說 使用其餘方式了,記在心上。 所以 構造 BigDecimal 儘可能不要使用 double 了。總結