前几天,系统处理double类型的加减法,出现问题。

请看题:

示例1

问, 结果是多少? 0.01?

No! 结果是0.009999999999999998!

为什么会这样呢? 因为float和double都是浮点数, 都有取值范围, 都有精度范围. 浮点数与通常使用的小数不同, 使用中, 往往难以确定. 常见的问题是定义了一个浮点数, 经过一系列的计算, 它本来应该等于某个确定值, 但实际上并不是!double相减会转换成二进制,因double有效位数为 16位这就会出现存储小数位数不够的情况,这种情况下就会出现误差,解决方法就是使用BigDecimal,它的有效长度足够长可存储 小数位数因此可代替double来进行加减乘除, 金额必须是完全精确的计算, 故不能使用double或者float, 而应该采用java.math.BigDecimal.

加减乘除

两个BigDecimal值应该怎样进行加减乘除呢? +, -, *, / 这样写吗? 不!

请看示例:

示例2

加减乘除使用了英文的加减乘除, 即add, substract, multiply和divide

大小比较

两个BigDecimal值怎么比较大小呢? 能用>或者<吗? 也不可以!

示例3

两个BigDecimal值比较使用compareTo方法, 比较结果有-1, 0, 1, 分别表示小于, 等于, 大于; 对于0, 可以使用BigDecimal.ZERO表示!

小数位数及四舍五入规则

在项目中, 涉及到税费的计算, 计算的结果可能是小数点后面十几位, 那么怎么进行结算呢? 这就需要四舍五入这种东东了.

示例4

其中setScale的第一个参数是小数位数, 这个示例是保留2位小数, 后面是四舍五入规则.

mysql数据库设计

BigDecimal在进行入库时, 数据库选择decimal类型, 长度可以自定义, 如18; 小数点我们项目中用的是2, 保留2位小数. 此外还要注意的就是默认值, 一定写成0.00, 不要用默认的NULL, 否则在进行加减排序等操作时, 会带来转换的麻烦!

`balance` decimal(18,2) DEFAULT '0.00' COMMENT '账户余额',

转载于:https://www.cnblogs.com/liuyk-code/p/6693002.html

BigDecimal与double相关推荐

  1. BigDecimal 与double 转化失真

    1.BigDecimal(double val): 失真, 不要使用 BigDecimal(0.1)的值是: 0.1000000000000000055511151231257827021181583 ...

  2. java bigDecimal and double

    Java BigDecimal和double BigDecimal是Java中用来表示任意精确浮点数运算的类,在BigDecimal中,使用unscaledValue × 10-scale来表示一个浮 ...

  3. Java BigDecimal类的一般使用、BigDecimal转double

    BigDecimal大据类. 浮点型运算的时候直接 加减乘除时可能会出现数据失真(精度问题). BigDecimal可以解决浮点型运算数据失真的问题. double a = 0.1;double b ...

  4. BigDecimal操作double、float精度丢失问题

    一.问题 最近使用BigDecimal进行数值加减运算的时候踩了一个小坑:BigDecimal操作double.float数值时精度丢失. 举个例子: public static void main( ...

  5. Java 中浮点数---------BigDecimal和double(初探)

    为什么要使用 bigdecimal? 借用<Effactive Java>这本书中的话,float和double类型的主要设计目标是为了科学计算和工程计算.他们执行二进制浮点运算,这是为了 ...

  6. decimal double java_Java BigDecimal和double BigDecimal类

    BigDecimal类 对于不需要任何准确计算精度的数字可以直接使用float或double,但是如果需要精确计算的结果,则必须使用BigDecimal类,而且使用BigDecimal类也可以进行大数 ...

  7. Java BigDecimal和double区别

    转自:  https://www.cnblogs.com/mingforyou/p/3344489.html BigDecimal类 对于不需要任何准确计算精度的数字可以直接使用float或doubl ...

  8. BigDecimal和Double的区别

    Double: 0,3 - 0,2 = 0.09999999999999998 Float: 0,3 - 0,2 = 0.10000001 BigDecimal: 0,3 - 0,2 = 0.1

  9. Java double 保留一个小数、理解BigDecimal、Java解决精度问题

    Java double 保留一个小数 两种方法 @Testpublic void test2() {double f = 234.353333000000000000000000;BigDecimal ...

最新文章

  1. 中国移动选择博科NFV软件设备来支持“互联网+”使命
  2. JSONP 跨域的原理
  3. TCL with SNPS collection_limitget_lib_pins
  4. NumPy学习笔记(一)
  5. vs(visual studio)调试功能里各个按钮的意义及使用方法?
  6. python功能代码_整理几个常用的Python功能代码片段【收藏】
  7. 为什么要用python不用origin_Python告诉你为什么百度已死
  8. Android提供了哪些主要UI控件,Android必备:Android UI控件的了解与学习
  9. win10安装mysql报错——无法项识别为 cmdlet、函数、脚 本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确保路径正确,然后再试一次。
  10. 构建安全的 Web Services
  11. 20145212 罗天晨 Web安全基础实践
  12. 科学期刊中关于计算机视觉,计算机视觉相关专业JCR1区期刊
  13. 坑爹的matlab除法
  14. SMAP数据产品介绍与下载方法
  15. Unity SetFromToRotation和FromToRotation的区别
  16. 快速掌握PS通道抠头发“七步法”
  17. html5网页制作电脑版,页未央HTML5制作神器PC版
  18. jest 客户端 实现 Sliced+Scroll并行查询
  19. Week of 3.21
  20. 京东数科“四位一体”布阵新基建沙场

热门文章

  1. 江苏大学考研885程序设计 - 编程题笔记
  2. JZ46把数字翻译成字符串
  3. python multiprocessing遇到Can’t pickle instancemethod问题
  4. android field 类型,Gradle buildConfigField 使用Hashmap ArrayList 等类型
  5. Linux设置封包报头的函数,GitHub - LinuxDigger/RTMP
  6. java实现文件夹复制_Java实现文件夹复制
  7. 实现基于内核栈切换的进程切换-linux011
  8. 历史数据导出excel_在数据产品中对导出功能的思考
  9. 数组的合并和升序排列_每日“力扣”系列10 下一个排列
  10. 《南溪的目标检测学习笔记》——neck组件的设计笔记