Java中BigDecimal解决精度丢失问题
1.我們先看一個例子
可以看到在Java中進行浮點數運算的時候,會出現丟失精度的問題。那么我們如果在進行商品價格計算的時候,就會出現問題。很有可能造成我們手中有0.06元,卻無法購買一個0.05元和一個0.01元的商品。因為如上所示,他們兩個的總和為0.060000000000000005。這無疑是一個很嚴重的問題,尤其是當電商網站的并發量上去的時候,出現的問題將是巨大的。可能會導致無法下單,或者對賬出現問題。所以接下來我們就可以使用Java中的BigDecimal類來解決這類問題。
2.BigDecimal中的一些方法
構造器 ? ? ? ? ? ? ? ? ? 描述 ? ? ? ? ? ? ? ? ? ? ?
? BigDecimal(int) ? ? ? 創建一個具有參數所指定整數值的對象。 ? ? ?
? BigDecimal(double) ? ?創建一個具有參數所指定雙精度值的對象。 ? ??
? BigDecimal(long) ? ? ?創建一個具有參數所指定長整數值的對象。 ? ??
? BigDecimal(String) ? ?創建一個具有參數所指定以字符串表示的數值的對象。
方法 ? ? ? ? ? ? ? ? ? ?描述 ? ? ? ? ? ? ? ? ? ? ? ??
? add(BigDecimal) ? ? ? BigDecimal對象中的值相加,然后返回這個對象。
? subtract(BigDecimal) ?BigDecimal對象中的值相減,然后返回這個對象。
? multiply(BigDecimal) ?BigDecimal對象中的值相乘,然后返回這個對象。
? divide(BigDecimal) ? ?BigDecimal對象中的值相除,然后返回這個對象。
? toString() ? ? ? ? ? ?將BigDecimal對象的數值轉換成字符串。 ? ?
? doubleValue() ? ? ? ? 將BigDecimal對象中的值以雙精度數返回。 ??
? floatValue() ? ? ? ? ?將BigDecimal對象中的值以單精度數返回。 ??
? longValue() ? ? ? ? ? 將BigDecimal對象中的值以長整數返回。 ? ?
? intValue() ? ? ? ? ? ?將BigDecimal對象中的值以整數返回。
3.值得注意的是如果要想無精度丟失的情況下計算結果,那么需要把double,float類型的參數轉化為String類型的。并且使用BigDecimal(String)這個構造方法進行構造。 去獲取結果。不然還是沒有效果。
(1)
?(2)
4.在一般開發過程中,我們數據庫中存儲的數據都是float和double類型的。在進行拿來拿去運算的時候還需要不斷的轉化,這樣十分的不方便。這里我寫了一個工具類,以后可以直接使用。
public class BigDecimalUtil {
?
? ? private BigDecimalUtil() {
?
? ? }
?
? ? public static BigDecimal add(double v1, double v2) {
? ? ? ? // v1 + v2
? ? ? ? BigDecimal b1 = new BigDecimal(Double.toString(v1));
? ? ? ? BigDecimal b2 = new BigDecimal(Double.toString(v2));
? ? ? ? return b1.add(b2);
? ? }
?
? ? public static BigDecimal sub(double v1, double v2) {
? ? ? ? //v1-v2?
? ? ? ? BigDecimal b1 = new BigDecimal(Double.toString(v1));
? ? ? ? BigDecimal b2 = new BigDecimal(Double.toString(v2));
? ? ? ? return b1.subtract(b2);
? ? }
?
? ? public static BigDecimal mul(double v1, double v2) {
? ? ? ? //v1*v2
? ? ? ? BigDecimal b1 = new BigDecimal(Double.toString(v1));
? ? ? ? BigDecimal b2 = new BigDecimal(Double.toString(v2));
? ? ? ? return b1.multiply(b2);
? ? }
?
? ? public static BigDecimal div(double v1, double v2) {
? ? ? ? //v1/v2
? ? ? ? BigDecimal b1 = new BigDecimal(Double.toString(v1));
? ? ? ? BigDecimal b2 = new BigDecimal(Double.toString(v2));
? ? ? ? // 2 = 保留小數點后兩位 ? ROUND_HALF_UP = 四舍五入
? ? ? ? return b1.divide(b2, 2, BigDecimal.ROUND_HALF_UP);// 應對除不盡的情況
? ? }
}
?
————————————————
版權聲明:本文為CSDN博主「一個可愛的姑娘」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/yin_xing_ye/article/details/94596247
總結
以上是生活随笔為你收集整理的Java中BigDecimal解决精度丢失问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Feign客户端 - 超时时间配置
- 下一篇: java美元兑换,(Java实现) 美元