对于金额类型,使用float和double存在损失精度的问题.
mysql中如何使用货币类型:
decimal(P,D);
P
是表示有效数字数的精度。P
范围为1〜65
。D
是表示小数点后的位数。D
的范围是0
~30
。MySQL要求D
小于或等于(<=
)P
。
使用decimal(6,2)类型,这个意思,你总共可以有10个小数位数,2表示你可以保存小数点后两位;
此时由decimal定义的列最多可以存储6
位数字,小数位数为2
位; 因此,amount
列的范围是从-9999.99
到9999.99
。
Java中如何使用货币类型:
使用BigDecimal类:
BigDecimal num3 = new BigDecimal( Double.toString( 1.0f ) );
BigDecimal num4 = new BigDecimal( Double.toString( 0.99999999f ) );
System.out.println( num3 == num4 ); // 打印 false
BigDecimal num1 = new BigDecimal( Double.toString( 0.2 ) );
BigDecimal num2 = new BigDecimal( Double.toString( 0.7 ) );
// 加
System.out.println( num1.add( num2 ) ); // 打印:0.9
// 减
System.out.println( num2.subtract( num1 ) ); // 打印:0.5
// 乘
System.out.println( num1.multiply( num2 ) ); // 打印:0.14
// 除
System.out.println( num2.divide( num1 ) ); // 打印:3.5
当我们从mysql中取出Decimal类型的数据得到的是一个String类型的数据,因此可以直接使用下面的方式.
BigDecimal b1 = new BigDecimal("1.34");//1.34
BigDecimal b2 = BigDecimal.valueOf(1.34);//1.34
如果直接new的话存在损失精度的问题,如下:
BigDecimal one1 = new BigDecimal(1.34);//1.3400000000000000799360577730112709105014801025390625