float、double、BigDecimal的一些精度问题
2024-10-10 15:07:12
float f = 280.8f;
System.out.println(f*100);
结果是什么?
结果是:28080.0f(我是这么想的)
实际结果是:28079.998
既然float处理有问题换double会不会有问题呢?
double f = 280.8d;
System.out.println(f*100);
结果是:28080.0
结果神奇般的达到了预期!是不是换double就好了呢?
再试一下
double f = 280.71d;
System.out.println(f*100);
结果是:28070.999999999996
是不是很坑呢?
再提供一种处理方式
BigDecimal d = new BigDecimal("280.71");
System.out.println(d.multiply(new BigDecimal("100")).doubleValue());
结果是:28071.0
再试试其他数据貌似也没问题了。
问题原因分析:280.8是十进制数据,计算机使用二进制数据表示。浮点数精度7位,double类型精度15位,BigDecimal API上的解释 Immutable, arbitrary-precision signed decimal numbers.
所以简单来说float存在精度丢失。double也存在,只是存在范围不同。BigDecimal能保存最大精度。涉及到计算非常在意精度请使用BigDecimal
最新文章
- 常见开发需求之前端利器webstorm中的git和快捷键
- 【HTML5】canvas画布练习
- 一些Demo链接
- Android——Dialog
- [转] Qt 多线程学习
- 各个手机APP客户端内置浏览器useragent
- 【原】centos6.5下hadoop cdh4.6 安装
- Image控件的简单使用示例1
- CLR via C# - Char_String
- 关于callContext
- leetcode415---字符串大数相加
- Cannot read property 'component' of undefined 即vue-router 0.x转化为2.x
- DDGScreenShot--iOS 图片处理--多图片拼接 (swift)
- Python将html转化为pdf
- 扩展方法IEnumerable<;T>;转换为IList<;SelectListItem>; ,提供@Html.DropDownList使用
- (7)Python赋值机制
- 插入排序算法的JAVA实现
- 〖Linux〗Shell十进制数值转换十六进制
- 为spring代理类设置属性值
- OPC and .NET