1、場景:從數據表中讀出Decimal類型的數據直接塞給Double類型的對象時,並不會有什麼異常。java
若是要再此基礎上計算,就會發生異常。mysql
好比:讀出數據爲0.0092,將其乘以100,則變成了0.919999999999999...sql
2、緣由:數據庫
java mysql 數據類型對照以下:
spa
類型名稱 | 顯示長度 | 數據庫類型 | JAVA類型 | JDBC類型索引(int) | 描述 |
VARCHAR | L+N | VARCHAR | java.lang.String | 12 | |
CHAR | N | CHAR | java.lang.String | 1 | |
BLOB | L+N | BLOB | java.lang.byte[] | -4 | |
TEXT | 65535 | VARCHAR | java.lang.String | -1 | |
INTEGER | 4 | INTEGER UNSIGNED | java.lang.Long | 4 | |
TINYINT | 3 | TINYINT UNSIGNED | java.lang.Integer | -6 | |
SMALLINT | 5 | SMALLINT UNSIGNED | java.lang.Integer | 5 | |
MEDIUMINT | 8 | MEDIUMINT UNSIGNED | java.lang.Integer | 4 | |
BIT | 1 | BIT | java.lang.Boolean | -7 | |
BIGINT | 20 | BIGINT UNSIGNED | java.math.BigInteger | -5 | |
FLOAT | 4+8 | FLOAT | java.lang.Float | 7 | |
DOUBLE | 22 | DOUBLE | java.lang.Double | 8 | |
DECIMAL | 11 | DECIMAL | java.math.BigDecimal | 3 | |
BOOLEAN | 1 | 同TINYINT | |||
ID | 11 | PK (INTEGER UNSIGNED) | java.lang.Long | 4 | |
DATE | 10 | DATE | java.sql.Date | 91 | |
TIME | 8 | TIME | java.sql.Time | 92 | |
DATETIME | 19 | DATETIME | java.sql.Timestamp | 93 | |
TIMESTAMP | 19 | TIMESTAMP | java.sql.Timestamp | 93 | |
YEAR | 4 | YEAR | java.sql.Date | 91 |
3、解決方案:code
一、將double類型從新變成BigDecimal類型,最後的結果還要獲取有效位數對象
double d = 111231.5585; 索引
BigDecimal b = new BigDecimal(f); ci
double df = b.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue(); io
二、由於數據表裏的類型是Decimal,因此講java對象中對應的成員變量的類型改爲BigDecimal便可。
4、BigDecimal簡介
在mysql中,對於精度比較高的數據存儲,好比money,須要用decimal類型,而不會採用float或double類型,緣由在於後者數據偏差較大。
decimal列的聲明語法是decimal(m,d)。
在mysql 5.1中,參數的取值範圍:
一、M是數字的最大數(精度)。其範圍爲1~65(在較舊的MySQL版本中,容許的範圍是1~254)。
二、D是小數點右側數字的數目(標度)。其範圍是0~30,但不得超過M。
說明:float佔4個字節,double佔8個字節,decimail(M,D)佔M+2個字節。
如DECIMAL(5, 2) 的最大值爲9 9 9 9 . 9 9,由於有7 個字節可用。
注:
M 與D 對DECIMAL(M, D) 取值範圍的影響
# 在mysql 3.23 及之後的版本中,decimal(m, d) 的取值範圍等於早期版本中的decimal(m + 2, d) 的取值範圍。
另一種數據類型:
LongBlob,這種數據類型能夠直接把圖像文件存到數據表中!
在研究mysql的decimal數據類型,現把數據實驗結果公佈:
數據庫版本:Server version: 5.0.45 Source distribution
一、建立表結構
二、插入數據
實際插入的b列數據爲:12345.12342
實際插入的b列數據爲:99999.99999
結論:decimal數據類型, 一、當插入的整數部分的值超過了其表示範圍後就直接忽略了小數部分的值,並以最大值填充。 二、當整數部分合法,小數部分多餘的位數,直接截斷。