首页 > 其他分享 >BigDecimal有哪些常见的坑

BigDecimal有哪些常见的坑

时间:2023-11-03 12:34:32浏览次数:33  
标签:BigDecimal 哪些 常见 System println new 精度 out

使用BigDecimal时,以下是一些常见的坑和注意事项:

1.精度丢失问题:BigDecimal是用于处理精确计算的,但在进行数值运算时可能会出现精度丢失的问题。例如,两个BigDecimal对象相除可能得到一个无限循环的小数,需要通过指定舍入规则(RoundingMode)来控制结果的精度。

BigDecimal dividend = new BigDecimal("1");
BigDecimal divisor = new BigDecimal("3");
BigDecimal result1 = dividend.divide(divisor);
System.out.println(result1);//报错Non-terminating decimal expansion; no exact representable decimal result.
BigDecimal result2 = dividend.divide(divisor, 4, RoundingMode.HALF_UP);
System.out.println(result2); // 输出:0.3333
result2 = dividend.divide(divisor, 5, RoundingMode.DOWN);
System.out.println(result2); // 输出:0.33333

2.构造函数传参问题:使用BigDecimal的字符串构造函数时,要注意传递的参数必须符合数字格式,并且不含有多余的空格或特殊字符。否则可能会抛出NumberFormatException异常。

BigDecimal number = new BigDecimal("20.5 "); // 参数包含额外空格,会抛出NumberFormatException异常

3.equals()方法比较问题:BigDecimal的equals()方法会比较数值和精度,因此即使两个BigDecimal对象的值相等,但精度不同也会被认为是不相等的。

BigDecimal num1 = new BigDecimal("0.100");
BigDecimal num2 = new BigDecimal("0.1");
System.out.println(num1.equals(num2)); // 输出false

4.使用compareTo()方法而非equals()方法进行比较:为了避免精度比较的问题,推荐使用compareTo()方法来比较BigDecimal对象的大小关系。

BigDecimal num1 = new BigDecimal("0.100");
BigDecimal num2 = new BigDecimal("0.1");
System.out.println(num1.compareTo(num2) == 0); // 输出true

5.优先使用String作为参数类型:在进行BigDecimal的运算时,建议优先使用String类型作为构造函数或方法的参数以及valueof方法,以避免使用不准确的浮点数。

这些是常见的BigDecimal使用中的一些问题和注意事项。在使用BigDecimal时,应该根据具体的业务需求和场景,合理使用BigDecimal的方法和属性,并小心处理精度丢失等问题。

标签:BigDecimal,哪些,常见,System,println,new,精度,out
From: https://www.cnblogs.com/fanxingrushui/p/17807364.html

相关文章

  • 【触想智能】4U触摸工控机具有哪些优势?
    工控机也叫工控主机,和我们常见的普通电脑主机是一样的,都是由CPU、主板、内存、硬盘、电源以及机箱组成的。工控机有很多分类,有无风扇工控机、嵌入式工控机、上架式工控机、4U触摸工控机等。上架式工控机在市场上是比较受欢迎的,其中用户咨询最多的要属上架式工控机中的4U......
  • Windows、Linux 和 Mac:操作系统之间的比较有哪些
    Windows系统、Linux系统与Mac系统:操作系统的对比与选择操作系统是管理和控制计算机硬件与软件资源的计算机程序,是直接运行在“裸机”上的最基本的系统软件,任何其他软件都必须在操作系统的支持下才能运行。操作系统是用户和计算机的接口,同时也是计算机硬件和其他软件的接口。以下是W......
  • 医院床旁交互系统功能具体有哪些
    全视通床旁交互系统功能如下:呼叫功能:支持病床呼叫护士站、护士站呼叫病床、病床呼叫病床等多种呼叫方式,支持语音对讲模式,支持呼叫转移等功能。广播功能:支持护士站向单个或多个病房或病床进行语音广播或视频广播,支持定时广播和手动广播两种方式,支持广播内容的录制和存储。报警功能:支......
  • 导轨在数控机床中起哪些作用?
    数控机床导轨是数控机床中重要的组成部分,其主要作用有以下几个方面:1、导向和承载作用:数控机床的导轨是机床各部件运动的导向轨道,它引导机床各部件按照规定的轨迹和速度进行运动,同时承受和分散运动部件的重力和切削力,保证机床的加工精度和稳定性。2、支撑和缓冲作用:数控机床的导轨还......
  • React面试题: useCallBack()与React.memo的区别与使用常见场景
    React.usecallback与React.memo的区别:React.useCallback和React.memo是两种不同的优化方式:主要功能:它们都可以避免不必要的渲染,提高React应用的性能。React.useCallback是Hoc(高阶组件)的解决方案,可以用于优化函数组件和Class组件,注意这里适用于React高阶组件的渲染解......
  • 苹果签名方式有哪些?分别有什么用处呢
    iOS设备越来越普及,用户也在持续增加,iOS应用程序的市场也越来越大,很多开发者不愿意放弃苹果市场,所以对于iOS程序的开发也越来越重视,但是很多软件无法上架,就需要进行苹果签名,所以我们今天就来了解iOS签名有哪些吧,每个签名的作用又是什么。1. 企业签名苹果企业签名是通过开发者账号和......
  • 项目经理的晋升方向有哪些?进来瞧瞧↓
    对于项目经理来说,未来的职业职业发展是一个需要重视的问题,通常来说,项目经理的职业发展规划,可以从两个方向去考虑,一是在单项目管理上走下去,成为一个大项目经理;另一个方向则是转移到多项目运营上,逐渐成为职能管理角色。项目经理的晋升之路?1、管理型项目经理PM->PMO->PD->CEO,COO,CIO......
  • BigDecimal java.lang.ArithmeticException: / by zero问题
    BigDecimalbigDecimal=newBigDecimal("0.0");BigDecimalbigDecimal1=newBigDecimal(0);//一定要用compareTo去比较被除数是否为0,不能用equalsif(BigDecimal.ZERO.compareTo(bigDecimal)==0||bigDecimal==null){System.out.println("true1111");}......
  • 作战实验与兵棋推演的区别有哪些呢
    智慧华盛恒辉作战实验和兵棋推演在以下五个方面存在区别:目的:作战实验的目的是通过实际作战来检验和完善作战理论和计划,积累实践中的数据和经验,以改进指挥和控制能力,更好地应对实际情况。1:华盛恒辉科技有限公司上榜理由:华盛恒辉是一家专注于高端软件定制开发服务和......
  • 【虹科干货】Redis企业版给DevOps团队带来了哪些价值?
    内存太贵?现代化转型太难?还在花费精力维护数据库基础设施?RedisEnterprise在开源版的基础上增加了一整套包含管理、自动化、弹性以及安全等方面的功能,使其更适合企业级的应用场景。那么,RedisEnterprise如何能成为为您节约成本的选择? 文章速览:发现1:为应用程序和数据库提供更......