裘千丈还是裘三尺——用挖矿的比喻说平台与门槛
漳裁俾估比如 0.1 0.2 并不等于 0.3,而是等于 0.30000000000000004——这也一度成为程序员圈子里的经典梗。所以用浮点数表示金额这种需要精确计算的数值,是会出现精度丢失问题的。double a 0.1;double b 0.2;System.out.println(a b); // 输出: 0.30000000000000004System.out.println(a b 0.3); // 输出: false再看一个更实际的例子,假设你在做一个电商系统的金额计算:double price 2.0;double discount 0.9;System.out.println(price * discount); // 输出: 1.7999999999999998你看,原本应该是 1.8 的结果,却变成了 1.7999999999999998。如果这是真实的订单金额,那可就出大问题了为什么会精度丢失为什么会有这种精度丢失呢?因为计算机底层都是用二进制存储的,但并不是所有十进制数都能用二进制精确表示。各位有兴趣的话可以试着算一下 0.1 的二进制是多少,算出来可以在评论区分享一下。算了一会你可能会发现:这怎么算不完?没错,出现了无限循环的情况——(0.1)?? (0.000110011001100...)? 像这种情况,计算机就没办法用二进制精确表示 0.1 了。而 double 类型在 Java 中占 64 位,按照 IEEE 754 标准,其中 1 位是符号位,11 位是指数位,52 位是尾数位。当遇到无限循环的二进制小数时,只能截断保存,这就导致了精度丢失。BigDecimal在 Java 中,无论是单精度还是双精度,表示的都是近似值。为了表示精确的小数值Java 提供了 BigDecimal 类型。BigDecimal 由两个部分组成无标度值(unscaled value)和标度(scale)。无标度值是一个整数,表示实际的数值;标度也是一个整数,表示小数点后的位数。举个例子,数字 123.45 在 BigDecimal 中:无标度值是 12345标度是 2实际值就是:12345 × 10?2 123.45用 BigDecimal 来处理刚才的金额计算:BigDecimal price new BigDecimal(2.0);BigDecimal discount new BigDecimal(0.9);BigDecimal result price.multiply(discount);System.out.println(result); // 输出: 1.80这下结果就对了equals 的坑在 BigDecimal 中不能用 equals 方法做等值比较,因为 equals 会同时比较无标度值和标度这两个内容。BigDecimal a new BigDecimal(0.1);BigDecimal b new BigDecimal(0.10);System.out.println(a.equals(b)); // 输出: false我们都知道 0.1 和 0.10 在数值上是相等的,但 equals 的结果却是 false。这是因为:a 的无标度值是 1,标度是 1b 的无标度值是 10,标度是 2虽然值相同,但它们的标度不同,所以 equals 返回 false。compareTo比较 BigDecimal 大小时应该使用 compareTo 方法,返回值为 1、-1、0,分别代表大于、小于、等于。BigDecimal a new BigDecimal(0.1);BigDecimal b new BigDecimal(0.10);System.out.println(a.compareTo(b)); // 输出: 0,表示相等BigDecimal c new BigDecimal(0.2);System.out.println(a.compareTo(c)); // 输出: -1,表示 a cSystem.out.println(c.compareTo(a)); // 输出: 1,表示 c a创建 BigDecimal 的正确姿势创建 BigDecimal 时,建议使用 String 类型的构造方法,也就是 new BigDecimal(0.1) 这样。BigDecimal right new BigDecimal(0.1);System.out.println(right); // 输出: 0.1BigDecimal wrong new BigDecimal(0.1);System.out.println(wrong); // 输出: 0.1000000000000000055511151231257827021181583404541015625如果你用了 new BigDecimal(0.1) 的方式,创建出来的值其实也不是 0.1,而是一个近似值。这是因为传入的 double 本身就已经是近似值了,BigDecimal 只是忠实地把这个近似值保存下来而已。还有一个更方便的方法:BigDecimal bd BigDecimal.valueOf(0.1);System.out.println(bd); // 输出: 0.1valueOf 方法内部会先把 double 转成 String,再调用 String 构造方法,所以也是安全的。常用的 BigDecimal 运算BigDecimal a new BigDecimal(10.5);BigDecimal b new BigDecimal(2.3);// 加法System.out.println(a.add(b)); // 12.8// 减法System.out.println(a.subtract(b)); // 8.2// 乘法System.out.println(a.multiply(b)); // 24.15// 除法(需要指定精度和舍入模式)System.out.println(a.divide(b, 2, RoundingMode.HALF_UP)); // 4.57注意除法操作时,如果不指定精度,遇到除不尽的情况会抛出 ArithmeticException。所以建议都加上精度和舍入模式。

相关新闻

ASP.NET状态管理的总结

ASP.NET状态管理的总结

烤掠仆桌VonaJS AOP编程 VonaJS AOP 编程包括三个方面的能力: 控制器切面: 为 Controller 方法切入逻辑 内部切面: 在 Class 内部,为任何 Class 的任何方法切入逻辑 外部切面: 在不改变 Class 源码的前提下,从外部为任何 Class 的任何方法切入…

2026/7/7 10:31:07 阅读更多 →
Daniel.Zhao

Daniel.Zhao

炒篮下鼗1.1 二分 & 双指针 关联博文:Atserkcn-0/1分数规划 P1404 平均数 既然要让子串平均数最大,那就二分平均数,判断能否达到即可。复杂度 ( log ? ) O(nlogV)。 关联题目:[2025国庆集训Day2C] course 点击查看代码 P404…

2026/7/7 10:32:18 阅读更多 →
PTE七炸和八炸分别是多少分?2026最全解释:对应分数、申请场景与提分方案

PTE七炸和八炸分别是多少分?2026最全解释:对应分数、申请场景与提分方案

如果你正在搜索 PTE七炸和八炸分别是多少分,先直接看答案: PTE七炸:通常指四个单项都达到 65分及以上PTE八炸:通常指四个单项都达到 79分及以上 这里的“炸”,不是官方术语,而是华人 PTE 备考圈里很常见的…

2026/7/7 1:49:07 阅读更多 →

最新新闻

杰理之发射器做选择连接【篇】

杰理之发射器做选择连接【篇】

在调用bt_search_device()后,程序会开始搜索设备:

2026/7/7 10:30:47 阅读更多 →
Spark 3.5 Scala 算子性能对比:map vs mapPartitions 处理 1GB 文本数据实测

Spark 3.5 Scala 算子性能对比:map vs mapPartitions 处理 1GB 文本数据实测

Spark 3.5 Scala 算子性能对比:map vs mapPartitions 处理 1GB 文本数据实战解析1. 核心差异与适用场景在大规模数据处理中,map和mapPartitions是Spark最基础的转换算子,但性能特征截然不同:map算子:对RDD中的每个元素…

2026/7/7 10:30:47 阅读更多 →
Stable Diffusion 3 与 Midjourney V6 对比评测:5个商业设计场景下的出图效率与成本分析

Stable Diffusion 3 与 Midjourney V6 对比评测:5个商业设计场景下的出图效率与成本分析

Stable Diffusion 3 与 Midjourney V6 商业设计实战评测:5大场景下的效率与成本拆解当电商设计师Lisa凌晨三点还在反复修改产品主图时,她需要的不是又一个AI绘画工具列表,而是能直接提升商业出图效率的实战解决方案。这正是我们耗时两个月深度…

2026/7/7 10:28:46 阅读更多 →
高效免费GPU内存检测:3个实用场景教你快速排查显卡硬件问题

高效免费GPU内存检测:3个实用场景教你快速排查显卡硬件问题

高效免费GPU内存检测:3个实用场景教你快速排查显卡硬件问题 【免费下载链接】memtestCL OpenCL memory tester for GPUs 项目地址: https://gitcode.com/gh_mirrors/me/memtestCL 你是否遇到过显卡运行不稳定、游戏频繁崩溃或计算任务异常中断的问题&#xf…

2026/7/7 10:26:46 阅读更多 →
星穹铁道自动化助手:告别重复劳动的游戏管家

星穹铁道自动化助手:告别重复劳动的游戏管家

星穹铁道自动化助手:告别重复劳动的游戏管家 【免费下载链接】StarRailAssistant 崩坏:星穹铁道自动化 | 崩坏:星穹铁道自动锄大地 | 崩坏:星穹铁道锄大地 | 自动锄大地 | 基于模拟按键 项目地址: https://gitcode.com/gh_mirro…

2026/7/7 10:24:45 阅读更多 →
如何在Windows上快速安装苹果USB驱动:终极解决方案指南

如何在Windows上快速安装苹果USB驱动:终极解决方案指南

如何在Windows上快速安装苹果USB驱动:终极解决方案指南 【免费下载链接】Apple-Mobile-Drivers-Installer Powershell script to easily install Apple USB and Mobile Device Ethernet (USB Tethering) drivers on Windows! 项目地址: https://gitcode.com/gh_mi…

2026/7/7 10:22:44 阅读更多 →

日新闻

鸿蒙新特性:图片画廊与轮播导航——构建沉浸式图片浏览体验

鸿蒙新特性:图片画廊与轮播导航——构建沉浸式图片浏览体验

图片浏览是移动应用中最高频的场景之一。从社交应用的照片流到电商平台的商品图集,从旅游应用的景点相册到摄影作品展示——用户对图片浏览的体验要求不断提高:流畅的切换动画、直观的缩略图导航、便捷的收藏操作、自动播放模式。HarmonyOS NEXT ArkUI 虽…

2026/7/7 0:05:16 阅读更多 →
24V DC-DC降压芯片PW2312B/PW2815,SOT23-6到SOP8-EP方案对比

24V DC-DC降压芯片PW2312B/PW2815,SOT23-6到SOP8-EP方案对比

24V稳压芯片完整选型指南 PW8600 PW75XX PW2815 PW2312B LDODC/DC全方案 一、24V稳压方案概述 24V直流电源在工业自动化、门禁系统、电梯控制、汽车电子、LED驱动、监控设备等场景中应用极广,是最常见的中压直流母线电压。要将24V母线稳定降压至下游MCU、传感器…

2026/7/7 0:05:16 阅读更多 →
RAG+知识图谱混合检索与Graph RAG核心对比

RAG+知识图谱混合检索与Graph RAG核心对比

做企业RAG落地的团队,往往容易卡在一容易踩坑的选型难题: 当需求单纯靠向量RAG搞不定、单纯靠知识图谱也搞不定,必须同时依赖「文本语义理解 实体关系推理」时,到底是做「向量图谱混合检索」就够了,还是必须上「Grap…

2026/7/7 0:07:19 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/6 8:11:50 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/6 8:11:52 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/6 6:52:56 阅读更多 →

月新闻