首页 星云 工具 资源 星选 资讯 热门工具
:

PDF转图片 完全免费 小红书视频下载 无水印 抖音视频下载 无水印 数字星空

Java中浮点数运算存在的精度问题以及解决方法

编程知识
2024年09月27日 19:45

观察以下一段代码,相信小朋友都可以一眼看出答案,但是计算机给出的答案是这样吗?
public class TestDouble {
public static void main(String args[]) {
System.out.println("0.05 + 0.01 = " + (0.05 + 0.01));
System.out.println("1.0 - 0.42 = " + (1.0 - 0.42));
System.out.println("4.015 * 100 = " + (4.015 * 100));
System.out.println("123.3 / 100 = " + (123.3 / 100));
}

}
完整运行结果:

想不到吧,最后的运行结果居然是这样一堆奇奇怪怪的小数
解答:这是因为因为浮点数在计算机内部是以二进制形式存储的,某些十进制小数无法精确表示。因此,直接运算可能会导致不精确的结果。
解决方法
这里给出三种简单的处理方法
方法一:四舍五入
使用Math.round()对结果进行四舍五入
以上述代码为例进行修改:
public class TestDouble { public static void main(String args[]) { System.out.println("0.05 + 0.01 = " + Math.round((0.05 + 0.01)*100.0)/100.0); System.out.println("1.0 - 0.42 = " + Math.round((1.0 - 0.42)*100.0)/100.0); System.out.println("4.015 * 100 = " + Math.round((4.015 * 100)*100.0)/100.0); System.out.println("123.3 / 100 = " + Math.round((123.3 / 100)*1000.0)/1000.0); } }
结果如下图:

注意:直接使用Math.round时只保留整数
方法二:使用BigDecimal 类
`import java.math.BigDecimal;
import java.math.RoundingMode;

public class BigDecimalRoundExample {

    public static void main(String[] args) {
        double num = 0.5 + 0.1;
        BigDecimal bd = new BigDecimal(Double.toString(num));
        BigDecimal x = bd.setScale(2, RoundingMode.HALF_UP);//2表示要保留的小数位数

        System.out.println(x); 
    }
}

`
结果:
0.06

From:https://www.cnblogs.com/zyh-828/p/18434461/2024-9-27-01
本文地址: http://www.shuzixingkong.net/article/2363
0评论
提交 加载更多评论
其他文章 SD卡的基本知识与选购指南
1、SD卡与TF卡 SD 卡:又叫标准 SD 卡,其尺寸大小为 32 x 24 x 2.1 mm ,一般用于数码相机、声卡和采集卡等设备。 TF 卡:又叫 micro SD 卡,其尺寸大小为 15 x 11 x 1 mm ,一般用于手机、游戏机、无人机和行车记录仪等设备;因为其尺寸更小巧,且还可以通
SD卡的基本知识与选购指南 SD卡的基本知识与选购指南 SD卡的基本知识与选购指南
mysql后台导入sql文件-设定字符集
需求描述:有一个user_info.sql 的文件里面都是插入user_info表的insert语句数据,数据量500M,要求快速插入mysql的数据库中。 解决方法: 1、利用客户端工具加载文件插入数据。 问题:执行数据特别慢,好几个小时才能插入,原因数据要从客户端发送到服务器网络传输和插入都消耗
《华为云DTSE》期刊免费下载:10个案例读懂云上架构升级策略
本文分享自华为云社区《《华为云DTSE》期刊第四期赋能云专刊,赋能云场景下DTSE服务各类开发者的案例分享》,作者:HuaweiCloudDeveloper。 把公司的开发者平台统一在一起,是华为云所担负的任务,其最终目的是要汇聚开发者、做厚“黑土地”,支撑三大根生态的发展壮大。这也意味着,作为支撑
《华为云DTSE》期刊免费下载:10个案例读懂云上架构升级策略 《华为云DTSE》期刊免费下载:10个案例读懂云上架构升级策略 《华为云DTSE》期刊免费下载:10个案例读懂云上架构升级策略
Linux 防火墙与安全管理工具详解
Linux 防火墙与安全管理工具详解 1. Iptables 概述 Iptables 是 Linux 系统中用于控制网络流量的工具,通过定义规则来过滤、转发和修改数据包。其规则可以细致地管理进入和离开系统的数据流。 1.1 三表五链 1.1.1 三表 Iptables 中主要有三种表,每种表用于不同
Linux 防火墙与安全管理工具详解
博客园商业化道路建议
根据园子目前的行动,基本可以总结出: 1.园子不希望加大广告投放面积和强度,保持园子的纯洁性。 2.园子不希望走文章推广以及付费道路,做好技术社区。 3.园子不希望牺牲普通用户权益,保障公众使用体验。 基于园子的救园方案,可以看出:园子希望通过用户主动开通 vip 来获取收入,但是又因不想剥夺普通用
一次实践:给自己的手机摄像头进行相机标定
目录1. 问题引入2. 准备工作2.1 标定场2.2 相机拍摄3. 基本原理3.1 成像原理3.2 畸变校正4. 标定解算4.1 代码实现4.2 详细解析4.2.1 解算实现4.2.2 提取点位4.3 解算结果5. 问题补充 1. 问题引入 不得不说,现在的计算机视觉技术已经发展到足够成熟的阶段了,
一次实践:给自己的手机摄像头进行相机标定 一次实践:给自己的手机摄像头进行相机标定 一次实践:给自己的手机摄像头进行相机标定
运算符、分支语句
位操作符: 可以直接操作二进制数位的内容;~是一个单目位操作符,它可以根据一个数字计算另外一个数字,这两个数字所有二进制数位的内容都不同(按位取反),使用的时候这个符号应该写在数字前面 双目位操作符:包括按位与(&),按位或(|)以及按位异或(^),他们都可以把两个数字对应二进制数位的内容做
手搓大模型Task03:手搓一个最小的 Agent 系统
前言 训练一个大模型是一件高投入低回报的事情,况且训练的事情是由大的巨头公司来做的事情;通常我们是在已有的大模型基础之上做微调或Agent等;大模型的能力是毋庸置疑的,但大模型在一些实时的问题上,或是某些专有领域的问题上,可能会显得有些力不从心。因此,我们需要一些工具来为大模型赋能,给大模型一个抓手
手搓大模型Task03:手搓一个最小的 Agent 系统 手搓大模型Task03:手搓一个最小的 Agent 系统