MySQL及Java中如何保证数值计算的精度

一. MySQL中如何保证数值精度

在MySQL数据库中使用decimal类型的字段存储数值类型

column_name  decimal(P,D);

D:代表小数点后的位数
P:有效数字位数。小数点也算一位。
例子

CREATE TABLE `test_decimal` (
  `id` int(11) NOT NULL,
  `amount` decimal(10,2) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8

二. Java中使用BigDecimal

使用BigDecimal类可以很好的保证数值精度。

三. 整合应用

  1. DAO
@Repository  
public interface TestDecimalDao {
    @Select("select * from test_decimal where id = #{id}")
    TestDecimal getTestDecimal(int id);
}
  1. 测试类
public class TestDecimalDaoTest extends BaseTest {
    @Resource  
    private TestDecimalDao testDecimalDao;

    @Test  
    public void test() {
        TestDecimal testDecimal1 =   testDecimalDao.getTestDecimal(1);
        TestDecimal testDecimal2 =   testDecimalDao.getTestDecimal(2);
        BigDecimal result =   testDecimal1.getAmount().add(testDecimal2.getAmount());
        System.out.println(result.floatValue());
    }
}

说明:
将jdbcType为decimal的数据转化为javaType为BigDecimal类型的数据。

使用decimal存储类型的缺点

1、占用存储空间。

浮点类型在存储同样范围的值时,通常比decimal使用更少的空间

2、使用decimal计算效率不高

因为使用decimal时间和空间开销较大,选用int作为数据库存储格式比较合适,可以同时避免浮点存储计算的不精确和decimal的缺点。对于存储数值较大或者保留小数较多的数字,数据库存储结构可以选择bigint。

参考文献:

作者:何甜甜在吗
juejin.im/post/5c08db5ff265da611e4d7417

你可能感兴趣的:(java)