`

double 值的陷阱

 
阅读更多
@Test
public void testT() {
double a = 1.8;
double b = 0.1;
double c = 1.9;
Double d = 0.0;
Double e = 0.00;
System.out.println((1.7 + 0) - 1.7);
System.out.println((1.7 + 0.1) - 1.8);
System.out.println((a + b) - c);
System.out.println(NumberUtil.round((a + b) - c));
System.out.println(NumberUtil.round(a + b) - c);
System.out.println(1.9 - 1.9);
System.out.println(d.doubleValue());
System.out.println(e.doubleValue());
}

结果:
0.0
0.0
2.220446049250313E-16
0.0
0.0
0.0
0.0
0.0

两个double 值相加并不一定相等
如:
printf("%.55f", 1.9)
        # 1.8999999999999999111821580299874767661094665527343750000
        printf("%.55f", 1.8 + 0.1)
        # 1.9000000000000001332267629550187848508358001708984375000
得:    (1.8 + 0.1) - 1.9 = 2.22044604925031e-16

设计数据库时,尽量使用decimal/numeric, 而避免使用float,double 作为金额等的计算。
分享到:
评论

相关推荐

    Java基础方面陷阱.

    陷阱在于,不理解“值”与“引用”的区别,可能会导致内存管理上的错误。 再者,运算符的使用也是面试中的常见考点。Java支持算术、比较、逻辑、位操作等多种运算符。特别是三元运算符,有时会在编写简洁代码时被...

    java SE(入门知识4)原生数据类型使用陷阱.docx

    - 要将`double`类型的值赋给`float`类型的变量,必须进行类型转换。有两种方法: - 强制类型转换:`Float a = (float)1.2;` - 使用后缀`F`或`f`来指定浮点数为`float`类型:`Float a = 1.2F;` 2. **变量初始化**...

    Java基础复习笔记03我们不会注意的陷阱.pdf

    Java编程语言中,有一些细节和陷阱常常被开发者忽视,这些细节在基础复习中至关重要,特别是在应对考试或实际项目开发时。以下是一些关键知识点的详细解释: 1. **字符串对象的处理**:Java虚拟机(JVM)对于通过...

    Java基础复习笔记03我们不会注意的陷阱

    ### Java基础复习笔记03:我们不会注意的陷阱 #### 1. 虚拟机对字符串的处理 在Java中,字符串是一个非常重要的概念,它由`java.lang.String`类表示。对于字符串的处理,Java虚拟机(JVM)有一个特殊的优化机制,即*...

    java面试陷阱集合

    32. **Singleton设计模式**:Singleton保证类只有一个实例,常用双检锁/双重校验锁(DCL,即double-checked locking)实现。 以上是Java面试中可能出现的一些陷阱问题及其详细解答,这些知识点对于Java开发者来说...

    等号操作符使用陷阱实例

    例如,在C++中,`int`不能直接赋值给`double`,需要显式转换。 通过理解这些知识点,你可以更好地掌握等号操作符的使用,避免在编程过程中陷入陷阱。记得,理解和遵循每种语言的语法规则以及最佳实践,是写出安全、...

    C++sizeof使用规则及陷阱分析

    ### C++ `sizeof` 使用规则及陷阱分析 #### 一、`sizeof` 概念介绍 在C++中,`sizeof` 是一个关键字,用于获取变量或类型(包括聚合类型)所占用的存储空间大小(以字节为单位)。这个关键字返回一个 `size_t` ...

    winform 值类型引用类型赋值源码

    1. 值类型:值类型包括基本数据类型(如int、double、bool)以及结构(struct)。它们在内存中直接存储其值。当一个值类型变量被赋值时,实际上是拷贝了该值到新的位置。这意味着对一个值类型变量的操作不会影响到...

    理解 C#值类型与引用类型.docx

    - **内置值类型**:包括整型(如`sbyte`, `short`, `int`, `long`等)、浮点型(`float`, `double`)、`decimal`、`bool`和`char`。 - **结构体(struct)**:用户自定义的值类型,直接继承自`System.ValueType`。...

    Java中常见的陷阱题及答案

    下面我们就来深入探讨一下Java中常见的陷阱及其解决方案。 1. **找奇数的陷阱** ```java public static boolean isOdd(int i){ return i % 2 == 1; } ``` 这段代码用来判断一个整数是否为奇数,但存在一个...

    Java解惑(中文+书签).pdf

    当使用`Double.toString`方法将`double`类型的值转换为字符串时,结果是足以将`double`值与最靠近的临近值区分开来的最短小数。因此,当你期望看到`0.90`时,实际看到的可能是`0.***`。这就是由于浮点数无法精确表示...

    Java的按值传递和按引用传递分析.rar

    - Java中的基本类型(如int, double, char等)是按值传递的。这意味着当你将一个基本类型的变量作为参数传递给方法时,实际传递的是该变量的副本,而不是变量本身。在方法内部对参数的任何修改都不会影响到原始变量...

    C++ sizeof 使用规则及陷阱分析

    例如,`sizeof(a=3)`会返回`int`的大小,而不是`a`赋值后的值,因为在编译时`a=3`被解析为类型`int`。 在处理数据类型时,`sizeof`遵循以下规则: 1. 基本数据类型如`char`、`short`、`int`、`long`、`float`、`...

    V20-Java笔记整理-重要概念和常见陷阱梳理.docx

    **7.7 Long型、Float型和Double型包装类对象声明陷阱** - 当使用大数值初始化这些包装类对象时,可能会因为超出基本类型范围而导致错误。 #### 总结 本文档详细介绍了Java的重要概念和技术要点,包括基础语法、面向...

    Java解惑(中文).pdf

    这是由于`double`类型无法精确表示所有的小数,尤其是无法精确表示`1.1`这个值,因此在计算过程中产生了近似值。对于货币等需要精确计算的应用场景,使用`double`类型并不合适。推荐使用整数类型(如`int`或`long`)...

    java解惑 中文版

    - `1.10` 无法被精确表示为一个 `double` 类型的值,因此实际上存储的是最接近 `1.10` 的 `double` 值。 - 当从 `2.00` 减去这个近似值时,得到的结果并非是最接近 `0.90` 的 `double` 值。 **解决方案** - 使用 `...

    浮点型如何在内存中进行存储呢?(csdn)————程序.pdf

    浮点型数据在计算机内存中的存储方式遵循国际标准IEEE 754,这是一种用于表示和操作浮点数的标准。在了解浮点数的存储机制前,我们先回顾一下浮点数...理解浮点数的存储方式对于解决相关问题和避免潜在的陷阱至关重要。

    浮点数的数据结构.pdf

    由于位宽更宽,double可以表示更大范围的值和更高精度的数字。 4. **浮点数二进制源码转换**: 将二进制浮点数源码转换为浮点数数据结构涉及几个步骤: - 步骤1:获取二进制浮点数源码,例如1010101.101011011。 ...

    新建 Microsoft Word 文档14

    总之,C#中的类型转换、重载方法处理、精度损失以及`out`关键字的使用都是编程中常见的陷阱。在编写跨语言交互的代码时,理解这些细节至关重要,可以避免不必要的错误和数据丢失。确保始终进行适当的数据类型检查和...

Global site tag (gtag.js) - Google Analytics