【Java-解决精度丢失】

浮点数为什么会精度丢失?

我们在程序中所写的值都是使用十进制的形式,但是计算机使用的是二进制。当计算机进行运算时会将十进制转换为二进制,再进行运算。

而浮点数的小数位在转换二进制时可能产生无序循环的情况,这时计算机会取近似值就造成了精度丢失。

如何解决?

当使用场景对精度要求高时,可以使用BigDecimal来解决浮点数精度丢失问题。

例子运用理解:

java 复制代码
public static void main(String[] args) {
		// 解决浮点数精度丢失(小数位数在计算时可能产生循环)
		BigDecimal dec1 = new BigDecimal("0.2");
		BigDecimal dec2 = new BigDecimal("0.1");
		
		System.out.printf("%f+%f=%f\n", dec1, dec2, dec1.add(dec2));
		System.out.printf("%f-%f=%f\n", dec1, dec2, dec1.subtract(dec2));
		System.out.printf("%fx%f=%f\n", dec1, dec2, dec1.multiply(dec2));
		// 除法除不尽,需要选择保留形式
		System.out.printf("%f÷%f=%f\n", dec1, dec2, dec1.divide(dec2, 10, RoundingMode.CEILING));
		// 除数+取余
		BigDecimal[] ret = 
		dec1.divideAndRemainder(dec2);
		System.out.println("商:" + ret[0]);
		System.out.println("余数:" + ret[1]);
	}
相关推荐
OPEN-F1 分钟前
C++17新特性精讲:结构化绑定、if constexpr与实用类型
开发语言·c++
CoderYanger2 分钟前
A.每日一题:3345. 最小可整除数位乘积 I
java·数据结构·程序人生·算法·leetcode·面试·学习方法
OPEN-F4 分钟前
C++并发编程:线程与互斥锁
开发语言·c++
俊昭喜喜里6 分钟前
C#中的decimal
开发语言·c#
小刘是地理大王6 分钟前
OpenFeign 兜底回调(fallback / fallbackFactory)实战指南
java·后端
橘子汽水16810 分钟前
Leetcode15:三数之和
java·数据结构·算法
Nolla11 分钟前
为什么 assertThrows 需要 () ->:Lambda 延迟执行与异常捕获
java
SL_staff14 分钟前
风控规则不该写代码:一个开发者视角的规则引擎实践拆解
java·架构·全栈
catchadmin16 分钟前
免费可商用 PHP 管理后台 CatchAdmin V5.4.0 发布,新增短信服务能力
开发语言·php