一、BigDecimal的加減乘除:
package com.cy.test.math; import java.math.BigDecimal; public class TestBigDecimal { public static void main(String[] args) { //加法 double d1 = 1.234; double d2 = 2.341; System.out.println(d1 + d2); //3.575 System.out.println(d1 * d2); //2.8887940000000003精度出問題了 System.out.println(d1 / d2); //0.5271251601879539 這個是對的 //使用BigDecimal,加法 BigDecimal b1 = new BigDecimal(Double.toString(d1)); BigDecimal b2 = new BigDecimal(Double.toString(d2)); System.out.println(b1.add(b2).doubleValue()); //3.575 //減法 System.out.println(b1.subtract(b2).doubleValue()); //-1.107 //乘法 System.out.println(b1.multiply(b2).doubleValue()); //2.888794 //除法 保留小數點后兩位,四舍五入 System.out.println(b1.divide(b2, 2, BigDecimal.ROUND_HALF_UP)); //0.53 } }
二、BigDecimal轉String的時候出現的精度問題:
有些兩位類型的小數如double類型的,直接轉化為String時,調用的是BigDecimal的toString方法,會出現精度問題。解決辦法:
package com.cy.test.math; import java.math.BigDecimal; public class TestBigDecimal3 { public static void main(String[] args) { BigDecimal b1 = new BigDecimal(1.23); BigDecimal b2 = new BigDecimal(1.24); BigDecimal b3 = new BigDecimal(1.25); System.out.println(b1); System.out.println(b2); System.out.println(b3); BigDecimal plus = b1.add(b2).add(b3); //直接打印會精度失真 System.out.println(plus); System.out.println(String.valueOf(plus.floatValue())); //設置小數位數,第一個變量是小數位數,第二個變量是取舍方法(四舍五入) BigDecimal plus2 = b1.add(b2).add(b3).setScale(2, BigDecimal.ROUND_HALF_UP); System.out.println(plus2); } }
打印結果:
1.229999999999999982236431605997495353221893310546875 1.2399999999999999911182158029987476766109466552734375 1.25 3.7199999999999999733546474089962430298328399658203125 3.72 3.72