原文地址

能使用 float 和 double 来表示金额等精确的值
关于面试,金额用什么数据类型?

不是 doube,更不是 float ,而是用 BigDecimal。对于金融项目,对于金额,误差是不能容忍的。那么用什么数据类型才能精确的表示金额?JDK 提供了一个 java.math.BigDecimal 的类,这个类可以表示任意精度的数字。

Java 中 float 的精度为 6-7 位有效数字。double 的精度为 15-16 位,BigDecimal 用来对超过16位有效位的数进行精确的运算

更多:百度百科 | BigDecimal

关于 float 和 double 的精度
float:2^23 = 8388608,一共七位尾数,这意味着最多能有 7 位有效数字,但绝对能保证的为6位,也即 float 的精度为 6~7 位有效数字;

double:2^52 = 4503599627370496,一共 16 位,同理,double 的精度为15~16位。

顺带看另一个问题:
float 不是 4 个字节 32 位吗?为啥最大值是 2128-1(3.40E+38)呢?

这和计算机数据存储有关,浮点数在计算机中是按科学计数法来存储的,其中 1 位符号位,8 位指数,23 位尾数。
在这里插入图片描述

问题一、出现的计算金额不准确,丢失精度:
看:

public class Test {

public static void main(String[] args) {double d1 = 11000;double d2 = 0.35;// 错误的:3849.9999999999995System.out.println("错误的:" + d1 * d2);BigDecimal bigDecimal1 = new BigDecimal(11000);BigDecimal bigDecimal2 = BigDecimal.valueOf(0.35);// multiply 乘法;正确的:3850.00System.out.println("正确的:" + bigDecimal1.multiply(bigDecimal2));}

}

问题二、数据类型转换时会有问题
public class Test {

public static void main(String[] args) {long longMaxVal = Long.MAX_VALUE;double doubleVal = longMaxVal / 1.0;double clone = doubleVal;// 参考 Alibaba 《码出高效》, 两浮点数之差小于 diff 任务相等比较改进float diff = 1e-6f;System.out.println(doubleVal);clone += 1000;System.out.println(clone);if (Math.abs(clone - doubleVal) < diff) {// doSystem.out.println("两数相等");} else {System.out.println("两数不相等");}
}

}

不能使用 float 和 double 来表示金额等精确的值相关推荐

  1. decimal,float和double的区别

    一直很奇怪C#的预定义数据类型中为什么加了一个decimal,有float和double不就够了吗?今天来挖一挖. 浮点型 Name CTS Type De script ion Significan ...

  2. float与double的精度问题

    [问题] 在之前的一篇文章中,提到过float和double不能用于金额计算,原因是浮点型数据计算中会产生误差,造成结果不准确.这一篇我们仔细分析这种误差的产生来源. 先看一段代码: public s ...

  3. Java 八种基本数据类型byte、short、int、long、float、double、boolean、char以及类型转换运算

    目录 八种基本类型 byte short int long float double boolean char 类型转换运算 八种基本类型 Java语言提供了八种基本类型.我们习惯上将其分为四大类型, ...

  4. 不能用float、double 存储金额——BigDecimal详解

    1.为什么不能使用 float 存储金额? public class FloatTest {public static void main(String[] args) {float f1 = 6.6 ...

  5. MySQL数据库存储价格金额使用的数据类型中float、double、decimal的区别

    float类型表示单精度浮点数值,double类型表示双精度浮点数值,float和double都是浮点型,而decimal是定点型: MySQL 浮点型和定点型可以用类型名称后加(M,D)来表示,M表 ...

  6. java定义商品金额_老大说:谁要再用double定义商品金额,就自己收拾东西走

    先看现象 涉及诸如float或者double这两种浮点型数据的处理时,偶尔总会有一些怪怪的现象,不知道大家注意过没,举几个常见的栗子: 典型现象(一):条件判断超预期 System.out.print ...

  7. mysql中的double类型_MySQL中float、double、decimal三个浮点类型的区别与总结!

    作者:极客小俊 一个专注于web技术的80后 我不用拼过聪明人,我只需要拼过那些懒人 我就一定会超越大部分人! CSDN@极客小俊,原创文章, B站技术分享 个人博客: cnblogs.com 前端h ...

  8. double 乘法_老大说:谁要再用double定义商品金额,就自己收拾东西走 | 文末福利...

    来源:CodeSheep 先看现象 涉及诸如float或者double这两种浮点型数据的处理时,偶尔总会有一些怪怪的现象,不知道大家注意过没,举几个常见的栗子: 典型现象(一):条件判断超预期 Sys ...

  9. double operator[](int i)_请谨慎使用float和double

    如果你做过交易系统或者做过金额计算的,应该非常清楚float和double类型是尤其不适合用于货币上的计算.因为要让float和double精确到0.1是不可能的. 例如,你的账户里有1.13,花了0 ...

最新文章

  1. python dataframe 中位数_python下的Pandas中DataFrame基本操作(一),基本函数整理
  2. 常用模块和面向对象 类
  3. 【C 语言】字符串操作 ( C 字符串 | 字符数组始化 )
  4. UMDF驱动开发入门
  5. nginx+fastcgi+c/c++搭建高性能Web框架
  6. C++ 编译,运行过程 详解。
  7. rust(67)-rust元组与空元组
  8. 01初识鸿蒙_移动通讯技术的发展
  9. with管理文件操作
  10. camera android 黑屏,Android Camera.startPreview()启动未报错,但SurfaceView无画面输出
  11. 突发!ARM中国区执行董事长兼CEO被免职
  12. beanshell断言_Beanshell断言
  13. python 模拟键盘_用Python模拟键盘输入
  14. marvell raid linux,佳能 RAID Console 驱动程序下载-更新佳能软件(磁盘阵列控制器)
  15. 使用iptables进行流量控制
  16. 手机话费充值页面HTMLcss3+html5模板
  17. oracle错误号提示ORA-
  18. 笔记本双系统安装Ubuntu 20.04.3 LTS没有WIFI的解决方法
  19. java minma_Java Core.minMaxLoc方法代码示例
  20. PostgreSQL 使用RETURNING返回值

热门文章

  1. js进栈出栈_[js]数组栈和队列操作
  2. TeamCity安装
  3. C# 中的委托和事件 (转)
  4. python数据驱动读取用例_利用Python如何实现数据驱动的接口自动化测试
  5. Ubuntu18.04安装Android Studio
  6. 平衡二叉树(AVL树)和红黑树区别
  7. Android REMOTE_SUBMIX原理(九)
  8. FaceBook ATC 弱网测试工具环境搭建
  9. Docker容器commit安装kali工具集
  10. android pm命令用法