java BigDecimal 的 setScale() 方法的 BigDecimal.ROUND_DOWN 舍入模式的BUG,坑

由於項目使用到 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 了。總結

相關文章
相關標籤/搜索