1. 程式人生 > >BigDecimal解決浮點精度丟失

BigDecimal解決浮點精度丟失

一、問題:

(1)在電商網站計算中,價錢計算是重要一環,那麼價錢是如何計算的,先來看:


可以看到如果用Long型別計算,會導致問題。

比如我買一件0.01元和0.05元的商品,我手裡一共0.06元,是可以購買的,但是付款的時候卻會發現錢不夠,因為Long型別,0.01+0.05等於0.060000000000000005,我們少了0.000000000000000005元。

同樣的下面,也會減乘除都會遇到這樣問題。

(2)在電商網站中,通常價錢計算用到的資料型別是BigDecimal:


看BigDecimal接收Long型別的構造器原始碼註釋:


可以看到,0.1但等於0.1000000000000000055511151231257827021181583404541015625.
傳遞的值不完全等於0.1。

所以也會同樣導致“0.06元無法購買0.01元和0.05的商品”。

(3)真正的解決方法是:

BigDecimal接收String型別的“數值”:


相關推薦

BigDecimal解決精度丟失

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

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

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

BigDecimal解決商業計算精度丟失問題

@Test public void test1(){ System.out.println(0.05+0.01); System.out.println(1.0-0.42); System.out.println(4.015*100

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

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

Java之道系列:BigDecimal如何解決點數精度問題

IEEE 754 IEEE二進位制浮點數算術標準(IEEE 754)是20世紀80年代以來最廣泛使用的浮點數運算標準,為許多CPU與浮點運算器所採用。這個標準定義了表示浮點數的格式(包括負零-0)與反常值(denormal number)),一些

C語言(精度

關於C語言的浮點數精度問題,很多人存在誤解,他們往往認為精度指的是float、double和long double三種資料型別,這是片面的。 拓展: 浮點數的二進位制儲存細節: 對於每個不同的浮點數,都有相應的最小可辨識精度(即δ),此最小可辨識精度隨著該

unity3d中Debug.Log函式精度問題

經常用Debug.Log函式來列印程式中的變數值,發現它顯示的小數位數只有一位。 這個實在太低了,像0.0xxxxx這種小數就成了0.0!!!!!! 這誤差太大了也! google了一下,確認是Debug.Log函式的問題,它在把Vector轉成字

JS點數精度丟失問題

由於計算機的二進位制實現和位數限制,有些數無法有限表示。就像一些無理數不能有限表示,如 圓周率 3.1415926...,1.3333... 等。JS 遵循 IEEE 754 規範,採用雙精度儲存(double precision),佔用 64 bit。 (1位用來表示

JS計算精度問題分析與解決

href 動態控制 hub 截斷 max fix math floating 方案 問題描述 在JS計算四則運算時會遇到精度丟失的問題,會引起諸多問題,看看以下例子: 例如:在chrome控制臺輸入 0.1 + 0.7 輸出結果是 0.7999999999999999 例如

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

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

精度丟失-解決方法(BigDecimal-加減乘除)

/** * 精度丟失問題解決方法 */ public static void main(String[] args) { double a = 1.0; double b = 0.9; System.out.println(a - b); // 解決精度丟失問題方法如下

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

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

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

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

Java中使用BigDecimal解決精度丟失問題

問題 :    有兩個double型別的數字:        double a=0.11;double b=595555.32;    諾是直接相加的結果:595555.4299999999 損失精度:解決辦法:建立bigdecimal物件,使用String型別來處理。下方是

Java之BigDecimal(存任意精度型)

BigDecimal :可以存任意精度的浮點型      構造方法:         BigDecimal(double b) : 會丟失精度         BigDecimal(String s)

java處理型別的加減乘除法出現小數點精度錯亂的解決方法

如果你在java裡面執行一下一段程式碼,你會發現會出現錯亂的小數點: double d1 = 100.0234; double d2 = 12.0652;

SpringMVC3.2 解決PO返回前臺轉成JSON時數據Long精度丟失問題

service extends object adapter pen ring opened strings gad SpringMVC3.2 解決PO返回前臺轉成JSON時數據Long精度丟失問題 方案 1、自定義一個傑克遜的json轉換類 public c

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

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

IAR無法打印解決方法

字符串 編寫 oid details char 解決方法 浮點 print log 問題現象:IAR for arm 重構printf函數後,可以打印出整形數據,但是無法打印出浮點數,並且option的配置也是對的 解決方法:我參考了如下鏈接的方式:http://blog.

oralce 將型字段,轉為指定精度 並且四舍五入

select round 四舍五入 3.5 oralce nbsp 例子 輸出結果 結果 使用 Round() 函數,該函數有兩個參數,第一個參數: 將要轉換的字段,第二個參數:保留的小數點位數 1 代表保留1位 2 代表保留2位 例子: SELECT round(12