- 1、java 小問題 double 做減法溢出
- 2、關於JAVA double類型相減的問題
- 3、java double類型變量,相加或相減後面小數為什麼會不一樣呢?
- 4、java中double減去取整的double為何會在0.00000000004左右徘徊,如1.2-(int)1.2 = 0.19999996,求大神解釋
- 5、java int double 加減法 基本類型運算問題
用BigDecimal計算
import java.math.BigDecimal;
import java.math.MathContext;
public class $ {
public static void main(String[] args) {
// 0.1*0.1+0.2*0.2+(-0.3)*0.3
// 0.1*0.1+0.2*0.2-0.3*0.3
BigDecimal a = new BigDecimal(0.1);
a = a.multiply(a, MathContext.DECIMAL32);
BigDecimal b = new BigDecimal(0.2);
b = b.multiply(b, MathContext.DECIMAL32);
BigDecimal c = new BigDecimal(0.3);
c = c.multiply(c, MathContext.DECIMAL32);
a = a.add(b, MathContext.DECIMAL32);
a = a.subtract(c, MathContext.DECIMAL32);
System.out.println(a.doubleValue());
}
}
-0.04
可以相減 你的寫法有錯
輸出函數的原型是print(String) 也就是括號裡面的是String類型
多個string連接的時候用就 ” + ” 連接 你這裡出現了 ” – ” 號 這是不允許的(double類型默認會調用toString()將數據轉換成string)
當你用:System.out.println(“兩個數的差是:”+a3-a4);減號被認為是錯誤的…
正確的寫法應該是:System.out.println(“兩個數的差是:”+(a3-a4));
至於你說 加 可以 只怕結果不是你想要的吧
乘除是因為運算符的優先級問題可以
建議你去看一些相關的基礎吧
該問題主要原因是浮點數值採用二進制系統表示,而在二進制系統中無法精確的表示1/10。就像我們平時使用的十進制中無法精確的表示1/3是一樣的道理,如果需要在數值計算中不含有任何誤差,要使用BigDecimal類進行編程。
具體的代碼如下
//兩個Double數值相加
public static Double add (Double value01,Double value02){
BigDecimal b1=new BigDecimal(value01.toString());
BigDecimal b2=new BigDecimal(value02.toString());
return b1.add(b2).doubleValue();
}
//兩個Double數值相減
public static Double sub (Double value01,Double value02){
BigDecimal b1=new BigDecimal(value01.toString());
BigDecimal b2=new BigDecimal(value02.toString());
return b1.subtract(b2).doubleValue();
}
假如除數和被除數都是int型,那麼得到的數也就是整數 1。
然後你將1賦值給double,他會自動轉換類型,變成double 1.0(轉換有一定規則,你查下就知道)。所有輸出值為1.0。
如果你想讓他輸出為1.5,你可以改變除數和被除數的類型(改變其中一個也可以,跟之前一樣的知識點)
1.-2.8421709430404007E-14表示-2.8421709430404007乘以10的-14次方,計算機能準確表示十進制的整數,但不能準確表示十進制小數。System.out.println(150.0+0+183.28-0-183.28-150.0);150.0+0+183.28-0-183.28-150.0的結果為0.00000000000…,只不過你的輸出結果為double型,精度比較高,沒有超出打印函數(println之類的)的默認精度而已。
2.System.out.println(((150.00)+0.00+(183.28))-(0.00+(183.28)+(150.00)));中將((150.00)+0.00+(183.28))作為個運算單元,二個括號內的運算的結果肯定一樣,與精度無關。結果當然為0。
3.用System.out.println((long)(150.0+0+183.28-0-183.28-150.0));(150.0+0+183.28-0-183.28-150.0)的結果為0.00000000…,轉換成long,捨棄小數位,結果自然為0;
4.System.out.println(150.0F+0+183.28F-0-183.28F-150.0F); 運算結果為float型,超出打印函數(println之類的)的默認精度,截取下來為0。
不知道解釋的你滿意不?
原創文章,作者:VNFP2,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/127008.html