首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

比较Java中的双精度会产生奇怪的结果

在Java中,双精度浮点数(double)是一种用于表示实数的数据类型,它具有较高的精度和范围。然而,由于浮点数的二进制表示方式,某些十进制小数可能无法精确表示为二进制小数,这可能导致一些奇怪的结果。

例如,当使用双精度浮点数进行加法、减法、乘法和除法等运算时,可能会出现舍入误差。这是因为浮点数的表示方式限制了其精度,使得某些十进制小数无法精确表示为二进制小数。

为了避免这种情况,可以使用Java中的Decimal类来进行精确的十进制运算。Decimal类提供了一个高精度的十进制浮点数表示,可以避免由于二进制表示限制而产生的舍入误差。

以下是使用Decimal类进行精确运算的示例代码:

代码语言:java
复制
import java.math.BigDecimal;

public class DecimalExample {
    public static void main(String[] args) {
        BigDecimal a = new BigDecimal("0.1");
        BigDecimal b = new BigDecimal("0.2");
        BigDecimal c = a.add(b);
        System.out.println(c);
    }
}

在这个示例中,我们使用BigDecimal类来表示十进制小数,并使用add()方法进行加法运算。这样可以避免使用双精度浮点数时可能出现的舍入误差。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

java float double精度为什么丢失?浅谈java浮点数精度问题

这样结果很让人讶异。20014999 这么小数字在float下没办法表示。于是带着这个问 题,做了一次关于float和double学习,做个简单分享,希望有助于大家对java 浮 点数理解。...IEEE 754 定义了32 位和 64 位精度两种浮点二进制小数标准。 IEEE 754 用科学记数法以底数为 2 小数来表示浮点数。...对于64 位精度浮点数,用 1 位表示数字符号,用 11 位表示指数,52 位表示尾数。如下两个图来表示: float(32位): ? double(64位): ?...为什么这样?...总结: 浮点运算很少是精确,只要是超过精度能表示范围就会产生误差。往往产生误差不是 因为数大小,而是因为数精度。因此,产生结果接近但不等于想要结果

2.4K10

Java 日期类型比较没有返回正确结果

最近在数据库处理时候发现日期对比时候没有返回正确结果。 但是保存时间实际上是相同。 代码如下: if (!...问题解决 经过 Debug 后,这 2 个日期纳秒数是不同,查看下对象如下。 我们会发现其中一个对象有纳秒,一个对象没有。 但是 fastTime 是相同。...如果使用 equals 那么这个方法比较是毫秒,所以是不相等。 因为多了一个 0。 如上图显示毫秒比较,因此这里不能使用这个比较方法。...在这里,我们转换成了 JODA 对象,然后再对比,通常能够削减精度。...dbDateTime.isEqual(mlsDateTime)) { } 说白了这个问题就是精度问题。 https://www.ossez.com/t/java/13833

3.4K00

java float double精度为什么丢失?浅谈java浮点数精度问题

这样结果很让人讶异。20014999 这么小数字在float下没办法表示。于是带着这个问 题,做了一次关于float和double学习,做个简单分享,希望有助于大家对java 浮 点数理解。...IEEE 754 定义了32 位和 64 位精度两种浮点二进制小数标准。 IEEE 754 用科学记数法以底数为 2 小数来表示浮点数。...对于64 位精度浮点数,用 1 位表示数字符号,用 11 位表示指数,52 位表示尾数。如下两个图来表示: float(32位): ? double(64位): ?...为什么这样?...总结: 浮点运算很少是精确,只要是超过精度能表示范围就会产生误差。往往产生误差不是 因为数大小,而是因为数精度。因此,产生结果接近但不等于想要结果

2.1K00

java float double精度为什么丢失?浅谈java浮点数精度问题

这样结果很让人讶异。20014999 这么小数字在float下没办法表示。于是带着这个问 题,做了一次关于float和double学习,做个简单分享,希望有助于大家对java 浮 点数理解。...IEEE 754 定义了32 位和 64 位精度两种浮点二进制小数标准。 IEEE 754 用科学记数法以底数为 2 小数来表示浮点数。...对于64 位精度浮点数,用 1 位表示数字符号,用 11 位表示指数,52 位表示尾数。如下两个图来表示: float(32位): ? double(64位): ?...为什么这样?...总结: 浮点运算很少是精确,只要是超过精度能表示范围就会产生误差。往往产生误差不是 因为数大小,而是因为数精度。因此,产生结果接近但不等于想要结果

1.4K20

Java 比较 equals 和 ==

比较什么如果你上培训班或者在学校学习的话,你老师大概率可能告诉你对于:基本类型:比较是值是否相同;引用类型:比较是引用是否相同;本来这里就有点复杂了,还非要搞出另外 2 个概念。...所以 Java 为 String 搞了一个 String Pool,对于程序,你这样定义字符 String s1 = "iSharkFly";这个数据是存储在 String Pool 里面的。...,这个对象在 Heap 内存。...hashCode都知道 hashCode 返回对象 HashCode 来识别对象,为什么上面的地址是一样?因为 hashCode 会在程序中被重写。...总结equals 和 == 在 Java 面试中经常会遇到。只需要记住是 == 比较是内存地址,在对值进行比较时候并不可靠。在实际编码过程,这种比较比较常见,所以还是有必要了解下这个。

13300

Java 比较运算符

但是到后来怎么运行结果都不太对,明明给 List 里添加元素里有相等,有些情况下应该不进入 if 才对,可是却每次比较完都进了 if。...小菜鸟惭愧极了,基础不牢靠啊,赶紧翻出自己 Java 入门书对应章节看了一下,看完才恍然大悟,原来 Java比较运算符里还有这么多小细节呢……不是把 C++ 里经验直接照搬过来就行了。...Java 比较运算符里一些细节 >、>=、< 和 <= 只支持两边操作数都是数值类型。 == 和 != 两边操作数可以都是数值类型,也可以都是引用类型,但必须是同一个类实例。...每种数值类型都有对应包装类,比如 long 包装类 Long。包装类实例可以与数值型比较,是直接取出包装类实例所包装数值来比较。...最佳实践 引用类型实例之间,除非想要知道是否是引用同一个对象,否则它们之间比较,总是使用 equals() 方法。 参考 《疯狂 Java 讲义》——李刚著 第 3.7.5 节 比较运算符。

1.3K20

Java 比较运算符

(他脑子里定势一直以为 List 类型参数还是 long 呢),Java 就是比 C++ 矫情。想想 IDE 这里只是警告,并不是错误,所以也不加理会继续完成他代码去了。...但是到后来怎么运行结果都不太对,明明给 List 里添加元素里有相等,有些情况下应该不进入 if 才对,可是却每次比较完都进了 if。...小菜鸟惭愧极了,基础不牢靠啊,赶紧翻出自己 Java 入门书对应章节看了一下,看完才恍然大悟,原来 Java比较运算符里还有这么多小细节呢……不是把 C++ 里经验直接照搬过来就行了。...Java 比较运算符里一些细节 >>=<<= ==!= 当 和 引用同一个对象时,则 ,否则 。 每种数值类型都有对应包装类,比如 long 包装类 Long。...包装类实例可以与数值型比较,是直接取出包装类实例所包装数值来比较。 涉及自动装箱后情况复杂了一些,比如 这时 ina == inb 成立,而 inc == ind 不成立。

1K30

java构建高效结果缓存

缓存是现代应用服务器中非常常用组件。除了第三方缓存以外,我们通常也需要在java构建内部使用缓存。那么怎么才能构建一个高效缓存呢? 本文将会一步步进行揭秘。...使用HashMap 缓存通常用法就是构建一个内存中使用Map,在做一个长时间操作比如计算之前,先在Map查询一下计算结果是否存在,如果不存在的话再执行计算操作。...; } 该接口定义了一个calculate方法,接收一个参数,并且返回计算结果。...我们希望是如果一个线程正在做计算,其他线程只需要等待这个线程执行结果即可。很自然,我们想到了之前讲到FutureTask。...FutureTask表示一个计算过程,我们可以通过调用FutureTaskget方法来获取执行结果,如果该执行正在进行,则会等待。 下面我们使用FutureTask来进行改写。

1.5K30

Java比较器Comparable与Comparator

Java比较器 在Java中经常会涉及到对象数组排序问题,那么就涉及到对象之间比较问题。...实现此接口对象可以用作有序映射中键或有序集合元素,无需指定比较器。...Comparable 典型实现:(默认都是从小到大排列) String:按照字符串字符Unicode值进行比较 Character:按照字符Unicode值来进行比较 数值类型对应包装类以及...使用背景: 当元素没有实现java.lang.Comparable接口而又不方便改代码,或者是实现了Comparable接口,也指定了两个对象比较大小规则,但此时不想按照预定义方法比较大小。...所以又增加了一个java.util.Comparator接口。强行对多个对象进行整体排序比较

71120
领券