1. 程式人生 > >BigDecimal解決浮點型運算中丟失精度的問題

BigDecimal解決浮點型運算中丟失精度的問題

BigDecimal在浮點型資料計算丟失精度的常見案例:

[java] view plain copy print?
  1. package com.mmall.test;  
  2. import org.junit.Test;  
  3. import java.math.BigDecimal;  
  4. /* 
  5.   Created by jia 
  6.  /
  7. publicclass BigDecimalTest {  
  8.     //和想象不太一樣,很容易丟失精度
  9.     //很多語言都有專門的貨幣計算,java沒有
  10.     //java在浮點型運算過程中會丟失精度
  11.     //很可能造成一個使用者有10元錢不能購買9.9999元的商品
  12.     @Test
  13.     public
    void test1(){  
  14.         System.out.println(0.05+0.01);  
  15.         System.out.println(1.0+0.42);  
  16.         System.out.println(4.015100);  
  17.         System.out.println(123.3/100);  
  18.         / 
  19.         0.060000000000000005 
  20.         1.42 
  21.         401.49999999999994 
  22.         1.2329999999999999 
  23.          /
  24.     }  
  25.     @Test
  26.     publicvoid test2(){  
  27.         BigDecimal b1 = new
     BigDecimal(0.05);  
  28.         BigDecimal b2 = new BigDecimal(0.01);  
  29.         //b1.add(b2);
  30.         System.out.println(b1.add(b2));  
  31.         //0.06000000000000000298372437868010820238851010799407958984375
  32.         //又長又亂
  33.     }  
  34.     @Test
  35.     publicvoid test3(){  
  36.         BigDecimal b1 = new BigDecimal(“0.05”);  
  37.         BigDecimal b2 = new BigDecimal(
    “0.01”);  
  38.         System.out.println(b1.add(b2));  
  39.         //0.06
  40.         //用string 構造器,完美解決
  41.     }  
  42. }  
通過上面的測試可知,使用BigDecimal的string構造器,可以完美解決這個問題。

下面封裝一個BigDecimalUntil工具類,方便以後使用:

[java] view plain copy print?
  1. package com.mmall.until;  
  2. import java.math.BigDecimal;  
  3. /* 
  4.   Created by jia 
  5.  */
  6. publicclass BigDecimalUntil {  
  7.     //使構造器不能在外部例項化
  8.     private BigDecimalUntil(){  
  9.     }  
  10.     publicstatic BigDecimal add(double v1,double v2){  
  11.         BigDecimal b1 = new BigDecimal(Double.toString(v1));  
  12.         BigDecimal b2 = new BigDecimal(Double.toString(v2));  
  13.         return b1.add(b2);  
  14.     }  
  15.     publicstatic BigDecimal sub(double v1,double v2){  
  16.         BigDecimal b1 = new BigDecimal(Double.toString(v1));  
  17.         BigDecimal b2 = new BigDecimal(Double.toString(v2));  
  18.         return b1.subtract(b2);  
  19.     }  
  20.     publicstatic BigDecimal mul(double v1,double v2){  
  21.         BigDecimal b1 = new BigDecimal(Double.toString(v1));  
  22.         BigDecimal b2 = new BigDecimal(Double.toString(v2));  
  23.         return b1.multiply(b2);  
  24.     }  
  25.     publicstatic BigDecimal div(double v1,double v2){  
  26.         BigDecimal b1 = new BigDecimal(Double.toString(v1));  
  27.         BigDecimal b2 = new BigDecimal(Double.toString(v2));  
  28.         return b1.divide(b2,2,BigDecimal.ROUND_HALF_UP);  
  29.         //除不盡的時候要四捨五入,並且保留幾位小數
  30.     }  
  31. }  

相關推薦

BigDecimal解決運算丟失精度的問題

BigDecimal在浮點型資料計算丟失精度的常見案例: [java] view plain copy print?package com.mmall.test;  import org.junit.Test;  import java.math.Bi

加減乘除(解決運算精度丟失問題)

package dealNumber; import java.math.BigDecimal; /** * 進行BigDecimal物件的加減乘除,四捨五入等運算的工具類 * * @author Yuk */ public clas

運算結果是不精確的,會出現精度丟失

float a = 1.1f; float b = 3.1415926f; //輸出結果3.1415925 精度丟失 double b=1.1d; double result = a+b; //結果是2.200000023841858 精度丟失 解析: 第

BigDecimal解決精度丟失

一、問題:(1)在電商網站計算中,價錢計算是重要一環,那麼價錢是如何計算的,先來看:可以看到如果用Long型別計算,會導致問題。比如我買一件0.01元和0.05元的商品,我手裡一共0.06元,是可以購買的,但是付款的時候卻會發現錢不夠,因為Long型別,0.01+0.05等於

js運算

轉載http://www.cnblogs.com/wangkongming/archive/2013/01/18/2866788.html <script> //加法函式,用來得到精確的加法結果  //說明:javascript的加法結果會有誤差,在兩個浮點數相

python整形運算規則

order adding containe 記得 ont 依然 pad syn htm https://www.cnblogs.com/fwindpeak/p/4891212.html 在python中,默認情況下,如果表達式中全是整型,結果也會僅僅是整型。有時候沒註意

MIPS運算,載入,加 減 乘 除以及比較大小

迭代法求平方根 main: li $v0,6 syscall #輸入浮點數 c.lt.s  $f14,$f10 #if(f14<f10) set condition flag=1 bc1t label#if(condition flag==1)go end label

【LoadRunner】解決指令碼字元或由轉字元

double atof( const char *string);  //申明函式 Action() {          float UpPrice1;         float i=0.1;         char* price1=(char*)calloc(10

python讀取excel,數字都是,日期格式是數字的解決辦法

6.2 spa 讀取excel pytho work clas odin 技術 div excel文件內容: 讀取excel: # coding=utf-8 import xlrd import sys reload(sys) sys.setdefaultenco

關於運算---比較

字符串 source dpa sans color word family justify 精度 1.常見問題 $a = 0.1; $b = 0.7; var_dump(($a + $b) == 0.8); 打印出來的值居然為 boolean false printf

數據轉存到字符串(轉)

gpa 就是 amp %d 輸出 .com char s 語言 oat 一、C語言中數值型數據分為兩大類:整型和浮點型整型:char int short long浮點型:float(單精度) double(雙精度) 二、浮點型數據轉存到字符串中char str[30]; /

正確生成的方法,解決sqlachemy Float的坑,生成float類時,長度和精度均為0,導致查詢不到結果!

依然 tab 圖片 control 選擇 分享 ice mod ble 問題描述 在使用flask_sqlachemy時,給price字段選擇了Float類型,數據庫用的mysql,生成數據庫表後,發現 from sqlalchemy import Float

正確生成的方法,解決sqlachemy Float的坑,生成float型別時,長度和精度均為0,導致查詢不到結果!

問題描述 在使用flask_sqlachemy時,給price欄位選擇了Float型別,資料庫用的mysql,生成資料庫表後,發現   from sqlalchemy import Float,Column price = Column(Float,default=0.00) &

整形數int、資料float,在記憶體儲存的表示

引言: 突然想到一個底層問題。 計算機組成原理裡學的:定點整數 定點小數 浮點數; 程式設計裡的基本資料型別int float在記憶體中的儲存形式; 二者究竟的對應關係是? CSDN部落格裡有這樣一句話,“實數在記憶體中以規範化的浮點數存放”,請先理清“實數”是多大範圍再回味這句話! 我在書上看到

MFCCString類字串與長整、字元陣列char資料之間的相互轉換

一、長整型資料與CString類字串相互轉換 1.將長整型資料轉換為CString字串類 CString str; long ld; str.Format(_T("%ld"),ld); 2.將CString字串類轉換為長整型資料 CString str; long ld; ld=

java判斷兩個(float)資料是否相等

示例程式碼: public static void main(String[] args) { float a = 10.222222225f; float b = 10.222222229f; System.out.println("使用==判斷是否相等:" + (

PHP對於的資料需要用不同的方法去解決

                Php: BCMathbc是Binary Calculator的縮寫。bc*函式的引數都是運算元加上一個可選的 [int scale],比如string bcadd(string $left_operand, string $right_operand[, int $scale

Java資料Float和Double進行精確計算的問題

Java中浮點型資料Float和Double進行精確計算的問題 來源  https://www.cnblogs.com/banxian/p/3781130.html   一、浮點計算中發生精度丟失       大概

Java數據Float和Double進行精確計算的問題

file 2.4 設置 數據 有一個 對比 科學 單個 做到 Java中浮點型數據Float和Double進行精確計算的問題 來源 https://www.cnblogs.com/banxian/p/3781130.html 一、浮點計算中發生精度丟失 大

基本內建型別佔多少位元組

今天做一個題目時,突然發現忘了int佔2位元組還是4位元組,有的說2位元組,有說4位元組。後來又翻書查一下,確認這個是和多少位系統以及編譯有關的。 不過可以用sizeof 運算子查出具體這個型別佔幾字