Java浮点类数字运算方式

 更新时间:2024年10月24日 14:24:47   作者:知楠行易  
在进行浮点数的加减运算时,直接使用+和-可能会引入精度误差,为了比较浮点数,可以使用Double的compareTo()方法,或者通过定义一个容差值(Epsilon)来判断两个浮点数是否相等,此外,Double.compare()方法也能比较两个double值

Java技术迷

浮点数运算可以直接使用 + 和 - 运算符进行加减操作,但可能会有一定的问题:

  • 精度问题
  • 比较问题
  • 累积误差

一、比较大小

比较问题:由于精度问题,直接比较两个浮点数是否相等可能会出错。

1.1 使用 compareTo() 方法

对于 Double 的包装类,可以使用 compareTo() 方法来比较两个 Double 对象的大小。

这个方法同样返回一个整数,表示比较的结果

1
2
3
4
5
6
7
8
9
10
11
Double a = 0.1 + 0.2;
Double b = 0.3;
 
int result = a.compareTo(b);
if (result < 0) {
    System.out.println("a is less than b");
} else if (result > 0) {
    System.out.println("a is greater than b");
} else {
    System.out.println("a is equal to b");
}

1.2 使用容差值(Epsilon)比较

1
2
3
4
5
6
7
8
9
10
11
double a = 0.1 + 0.2;
double b = 0.3;
double epsilon = 0.000001; // 容差值
 
if (Math.abs(a - b) < epsilon) {
    System.out.println("a and b are approximately equal");
} else if (a < b) {
    System.out.println("a is less than b");
} else {
    System.out.println("a is greater than b");
}

1.3 使用 Double.compare()

Double.compare() 方法是一个静态方法,可以用来比较两个 double 值。

这个方法会返回一个整数,表示第一个值与第二个值的关系:

  • 如果第一个值小于第二个值,则返回负数。
  • 如果第一个值等于第二个值,则返回零。
  • 如果第一个值大于第二个值,则返回正数。
1
2
3
4
5
6
7
8
9
10
11
double a = 0.1 + 0.2;
double b = 0.3;
 
int result = Double.compare(a, b);
if (result < 0) {
    System.out.println("a is less than b");
} else if (result > 0) {
    System.out.println("a is greater than b");
} else {
    System.out.println("a is equal to b");
}

二、求和运算

  • 精度问题:浮点数在计算机中是以近似值存储的,因此在进行加减运算时可能会出现精度损失。
  • 累积误差:在进行多次浮点数运算时,误差可能会累积,导致结果偏差更大。

2.1 使用 BigDecimal 精确求和

1
2
3
4
5
6
7
// 创建 BigDecimal 对象
BigDecimal num1 = new BigDecimal("0.1");
BigDecimal num2 = new BigDecimal("0.2");
 
// 精确求和
BigDecimal sum = num1.add(num2);
sum.doubleValue()

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

蓄力AI

微信公众号搜索 “ 脚本之家 ” ,选择关注

程序猿的那些事、送书等活动等着你

原文链接:https://blog.csdn.net/code_nn/article/details/143200913

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权/违法违规/事实不符,请将相关资料发送至 reterry123@163.com 进行投诉反馈,一经查实,立即处理!

相关文章

  • java 如何远程控制tomcat启动关机

    java 如何远程控制tomcat启动关机

    这篇文章主要介绍了java 远程控制tomcat启动关机的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-04-04
  • 什么是RESTful API,有什么作用

    什么是RESTful API,有什么作用

    提到RESTful API大家势必或多或少听说过,但是什么是RESTful API ?如何理解RESTful API 呢?今天咱们就来聊聊这个RESTful API
    2023-11-11
  • Spring之异步任务@Async解读

    Spring之异步任务@Async解读

    这篇文章主要介绍了Spring之异步任务@Async,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07
  • java8中Map的一些骚操作总结

    java8中Map的一些骚操作总结

    这篇文章主要给大家介绍了关于java8中Map的一些骚操作,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-02-02
  • Java实现LeetCode(1.两数之和)

    Java实现LeetCode(1.两数之和)

    这篇文章主要介绍了Java实现LeetCode(两数之和),本文使用java采用多种发放实现了LeetCode的两数之和题目,需要的朋友可以参考下
    2021-06-06
  • SpringMvc接受请求参数的几种情况演示

    SpringMvc接受请求参数的几种情况演示

    Springmvc接受请求参数的几种介绍,如何接受json请求参数,本文通过实例代码给大家介绍的非常详细,需要的朋友参考下吧
    2021-07-07
  • SpringBoot整合Druid数据源的方法实现

    SpringBoot整合Druid数据源的方法实现

    Druid是阿里开发的一款开源的数据源,被很多人认为是Java语言中最好的数据库连接池,本文主要介绍了SpringBoot整合Druid数据源的方法实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-06-06
  • java设计模式之单例模式学习

    java设计模式之单例模式学习

    单例对象(Singleton)是一种常用的设计模式。在Java应用中,单例对象能保证在一个JVM中,该对象只有一个实例存在
    2014-01-01
  • Spring源码解密之默认标签的解析

    Spring源码解密之默认标签的解析

    这篇文章主要给大家介绍了关于Spring源码解密之默认标签的解析的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2018-01-01
  • Mybatis批处理、Mysql深分页操作

    Mybatis批处理、Mysql深分页操作

    这篇文章主要介绍了Mybatis批处理、Mysql深分页操作,Mybatis批量操作包括Foreach方式和ExecutorType.BATCH插入操作,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-08-08

最新评论