首页 > 其他分享 >BigDecimal使用注意的地方

BigDecimal使用注意的地方

时间:2024-09-04 16:15:43浏览次数:8  
标签:BigDecimal 计数法 注意 使用 字符串 new 精度

BigDecimal 是 Java 中的一个类,这个相信大家都是知道的。它的作用就是可以表示任意精度的十进制数,BigDecimal 提供了精确的数字运算,适用于需要高精度计算的场景。

一、浮点精度

我们先来看一个例子:

compareTo 方法比较中,a.compareTo(b)

返回:

  • -1: a小于b

  • 0: a等于b

  • 1: a大于b。

在上方的代码中,我们使用 new BigDecimal 的形式 new 了两个 BigDecimal 对象,分别是 0.1 和0.10

我们分别使用了 equals 与 compareTo 进行比较,当使用 equals 进行比较时,返回了 false,这是因为 equals 不仅比较了值是否相等,还比较了精度是否相等。

 

简单概括一下,如果比较两个 BigDecimal 对象的大小,那就使用 compareTo 方法;如果严格比较精度的大小,那就使用 equals 方法进行比较。

 

二、设置精度

在做 BigDecimal 对象计算的时候,一定要设置精度。

 

在做 divide 运算时,如果商是一个无限小数,而操作的结果是一个精确的数字,那么就会抛出该异常。

 

 

三、初始化

先来看代码:

 

在使用 new BigDecimal 构造器进行初始化的时候,如果有初始值,最好使用字符串的构造方法进行初始化。

在使用 double 的构造器进行新建时,本身传入的 0.1 就是浮点类型了,为了不丢失精度,在使用 new BigDecimal 新建时就把这个近似值完整的保留下来了。

或者就是 另外一种初始化方式 BigDecimal.valueOf(0.1);,通过看源码可以发现,在 valueOf 的内部,将 Double 类型直接转为了字符串了,因此也就不会存在精度丢失的问题了。

 

四、转字符串

还是先看一段代码:

 

上面代码中是一个非常大的数,我想把他转为字符串,可是在使用 toString() 方法时,打印出来的却是科学计数法。

所以如果想使用 toString() 方法进行转字符串时,可以使用设置精度的方法,但是结果还是与我们的预期有所差别,我们想要的是一模一样的打印出来呢?

那么 toPlainString 就上场了,这个方法返回一个字符串的表示形式,包含所有的有效数字。

代码修改如下: 

 

所以总结就是
  • toString:返回有效数字,必要的时候使用科学计数法。
  • toPlainString: 不实用任何科学计数法。
  • toEngineeringString:必要的时候使用工程计数法。

标签:BigDecimal,计数法,注意,使用,字符串,new,精度
From: https://www.cnblogs.com/fengdongd/p/18396730

相关文章

  • 日志打印的时候使用占位符而不是用字符串拼接
    日志打印的时候使用占位符而不是用字符串拼接1.logger.info("错误信息:"+e.getMessage());  //字符串拼接2.logger.info("错误信息:{}"+e.getMessage()); //使用占位符(正确使用方式)因为String字符串的拼接会使用StringBuilder的append()方式,有一定的性能损耗。......
  • 使用Cmake-编写CMakeLists.txt 文件
    好处:a)跨平台(makefile跟平台强相关)b)cmake可以自动生成makefile编写CMakeLists.txt文件#关键主体:cmake_minimum_required(VERSION3.10)#指定最低支持的CMake版本project(FunMainVERSION1.0)#定义项目名称及版本号#添加可执行文件add_executable(${PROJECT_N......
  • 【深度学习 transformer】使用pytorch 训练transformer 模型,hugginface 来啦
    HuggingFace是一个致力于开源自然语言处理(NLP)和机器学习项目的社区。它由几个关键组件组成:Transformers:这是一个基于PyTorch的库,提供了各种预训练的NLP模型,如BERT、GPT、RoBERTa、DistilBERT等。它还提供了一个简单易用的API来加载这些模型,并进行微调以适应特定的下游任务......
  • 线程池使用
    1、不使用java内置线程池因为会设置默认最大线程数,可能造成负载不足OOM 2、使用自定义线程池 比较重要的三个参数 coreThreadSize核心线程数,通过最大线程数*20%maxThreadSize最大线程数 1、计算密集型(CPU密集型)线程数=N(CPU数量)+12、IO密集型线程数......
  • chroot在银河麒麟桌面上的使用
    chroot介绍:chroot就是change-root,可以说是最简单和古老的容器化软件之一,它允许用户安全地将应用程序和服务隔离。chroot通过更改程序的根目录,限制访问和可见性,从而提供了额外的隔离和安全层级。将程序设置为chroot环境是一种在安全空间中测试其可靠性的好方法,而不会改变实际系......
  • 教育问答工具V1.0—使用手册
    背景信息阿里云微服务SpringCloudAlibabaSpringCloudAlibaba是阿里巴巴提供的微服务开发一站式解决方案,是阿里巴巴开源中间件与SpringCloud体系的融合。以下是对SpringCloudAlibaba的详细介绍:定义:SpringCloudAlibaba是阿里巴巴结合自身丰富的微服务实践而推出的微服务开发......
  • C# .Net使用的代码混淆工具 ConfuserEx
    原文链接:https://www.cnblogs.com/lg-lg/articles/17803347.html开源.net混淆器ConfuserEx介绍下载地址:https://github.com/yck1509/ConfuserEx/releases第一步:第二步:第三步:当日志显示绿色Finish即是执行成功了......
  • 使用CCProxy让手机访问电脑能访问的网址
    一、遇到的问题    在某个局域网内,由于电脑端进行了hosts配置,可以访问某个特定网站AAA,大部分android手机由于无法root导致无法配置hosts文件(android通过使用模拟器root后可以修改hosts文化);ios由于权限原因也无法配置hosts文件,所以无法访问AAA网站。二、解决方法  ......
  • Java中用于格式化文本消息的工具类MessageFormat.format,使用{x}占位符
    MessageFormat.format 是Java中用于格式化文本消息的工具类。它允许你定义一个模板字符串,并使用一组参数来填充模板中的占位符。这个类是用于处理复杂消息格式的,例如多语言环境下的消息。MessageFormat.format 的使用方式如下:publicstaticStringformat(Stringpattern,......
  • 【TVM 教程】在 Relay 中使用外部库
    作者:MasahiroMasuda,TrumanTian本文介绍如何将cuDNN或cuBLAS等外部库与Relay一起使用。Relay内部用TVM来生成target-specific的代码。例如,TVM使用CUDA后端为用户提供的网络中的所有层生成CUDA内核。有时也可将各个供应商开发的外部库合并到Relay中,TVM有一种......