Double的使用注意,BigDecimal和Numberformat使用

树莓派34/100 - Pico读取MPU6050加速度陀螺仪传感器数据 树莓派Pico连接MPU-6050模块(三轴陀螺仪+三轴加速度),读取运动姿态数据。 阅读详情

1、在要求结果精确的商业计算中,尽量使用BigDecimal,float和double类型的主要设计目标是为了科学计算和工程计算,他们执行二进制浮点运算,这是为了在广域数值范围上提供较为精确的快速近似计算而精心设计的。使用BigDecimal并且一定要用String来构造。为什么不能使用Float和Double作精准的商业计算,举个例子:

 System.out.println(0.05+0.01); 得到的结果是0.060000000000000005;

为什么不是0.06呢?其实这涉及到计算机存储问题,因为计算机并不识别除二进制以外的其他任何数据,所以是编译器进行计算的时候,首先会计算0.05的二进制表示,为0.00001100110011001100110011001100110011001100110011001101,其次为0.01的二进制表示为0.00000010100011110101110000101000111101011100001010001111011,然后相加,最后再转换为十进制,最后结果为0.060000000000000005,而不是0.06.

那么如何在计算中得到想要的0.06呢?可以使用java.math.Bigdecimal类中的BigDecimal,它支持任何精度的定点数,也可以用于精确的计算货币值。

2、BigDecimal的使用

它总共有四个构造方法

  • BigDecimal(int) 创建一个具有参数所指定整数值的对象。
  • BigDecimal(double) 创建一个具有参数所指定双精度值的对象。
  • BigDecimal(long) 创建一个具有参数所指定长整数值的对象。
  • BigDecimal(String) 创建一个具有参数所指定以字符串表示的数值的对象。

建议基于以上两种构建构造函数

小数的构造函数可以如下BigDecimal("0.01") 或 BigDecimal(1, 2) 构造 BigDecimal ,这两种方法都可以精确的表示小数

BigDecimal支持以下计算方式:

  • BigDecimal add(BigDecimal augend) 加法运算                                                                                          如:BigDecimal b1 = new BigDecimal(Double.toString(v1));  
            BigDecimal b2 = new BigDecimal(Double.toString(v2));  
            return b1.add(b2).doubleValue();  
  • BigDecimal subtract(BigDecimal subtrahend) 减法运算
  • BigDecimal multiply(BigDecimal multiplicand) 乘法运算
  • BigDecimal divide(BigDecimal divisor) 除法运算

BigDecimal小数位的取值

BigDecimal a= new BigDecimal("1.35");

对数值取值:

1.a.setScale(1,BigDecimal.ROUND_DOWN);

    取一位小数,直接删除后面多余位数,故取值1.3.

2.a.setScale(1,BigDecimal.ROUND_UP);

    取一位小数,删除后面位数,进一位,故取值1.4.

3.a.setScale(1,BigDecimal.ROUND_HALF_UP);

    取一位小数,四舍五入,故取值1.4.

4.a.setScale(1,BigDecimal.ROUND_HALF_DOWN);

    取一位小数,四舍五入,但是5也是舍弃,故取值1.3.

BigDecimal的比等方法

    equals() 方法认为,两个表示同一个数但换算值不同(例如, 100.00 和 100.000 )的 BigDecimal 值是不相等的。然而, compareTo() 方法会认为这两个数是相等的,所以在从数值上比较两个 BigDecimal 值时,应该使用 compareTo() 而不是 equals() 

3、Numberformat格式化使用

BigDecimal bigLoanAmount = new BigDecimal("12.11");  
BigDecimal bigInterestRate = new BigDecimal("1.15");  
NumberFormat currency = NumberFormat.getCurrencyInstance();    //建立货币格式化引用  
NumberFormat currency2 = NumberFormat.getCurrencyInstance(Locale.US);//建立美元格式引用
NumberFormat percent = NumberFormat.getPercentInstance();     //建立百分比格式化用  
percent.setMaximumFractionDigits(3);               //百分比小数点最多3位  
System.out.println(currency.format(bigLoanAmount)); 结果:¥12.11
System.out.println(currency2.format(bigLoanAmount)); 结果:$12.11

System.out.println(percent.format(bigInterestRate)); 结果:115%

参考博客:https://blog.csdn.net/ShareUs/article/details/51436693

                https://blog.csdn.net/u013424496/article/details/51770197


C++智能指针:防止内存泄漏的最佳选择 因此,使用智能指针是防止内存泄漏的最佳选择之一,也是 C++ 编程范式中不可或缺的一部分。智能指针是一个 C++ 类模板,其目标是模拟原生指针的行为,但提供更高的安全性易用性。上述代码示例中,智能指针的生命周期由其引用计数器的状态来确定。因此,当最后一个引用离开作用域,智能指针将自动删除其所维护的对象。这种自动化的内存管理可以帮助程序员减轻内存泄漏等问题所带来的负担,从而提高代码的可靠性健壮性。使用智能指针可以避免许多与内存管理相关的问题,并提高代码的可维护性安全性。在上面的示例中,我们使用 阅读详情

相关推荐

【目标检测】基于yolov5的水下垃圾检测(附代码数据集,7684张图片)

【目标检测】基于yolov5的水下垃圾检测(附代码数据集)

学无止境、积少成多、厚积薄发 4146

使用NumberFormatDouble数值保留两位数小数点

问题:报异常Could not write JSON: For input string: "15,012.69",当整数位是三位数的候是正确的,大于三位数的候就会产生异常。解决:调用NumberFormat的setGroupingUsed传值为false,控制NumberFormat千位分组,不让他进行分组。数值比较小没有问题,但是数值较大后就出现异常,这是因为NumberFormat默认会把达到千位数值以分号,进行分割。需求:对double数据类型的值进行保留两位数小数点的操作。

mrxutada的博客 1144

NetBOX解包工具(含源码)

NetBox是一个小型的asp网站服务器,这个工具可以把通过NetBox封装的网站程序解开。(因为用到了汇编,使用可能会被杀毒软件报毒,请把杀软关闭即可。不放心的可自己编译)

关于BigDecimal double 类型保存金钱,以及精度问题,银行家舍入法

1、 BigDecimal 类型数据 的创建,构造函数 有 1 public BigDecimal(BigInteger intVal, long val, int scale, int prec); 2 3 public BigDecimal(char[] in, int offset, int len) ; 4 5 public BigDecimal...

weixin_34380781的博客 409

BigDecimal用法 & NumberFormat用法

[size=large][color=red]BigDecimal用法[/color][/size][url]http://www.cnblogs.com/linjiqin/p/3413894.html[/url] 一、简介 Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算。双精度浮点型变量double可以处理16位有效数。在实际...

pyzheng的专栏 1210

Java常用类库——数字格式化(NumberFormat)与大数操作(BigIntger、BigDecimal类)...

学习目标 可以使用NumberFormat类进行本地化数字显示。 可以使用DecimalFormat指定格式化模板。 可以使用BigInteger操作大整数。 可以使用BigDecimal指定小数的保留位数。 NumberFormatNumberFormat表示数字的格式化类,即:可以按照本地的风格习惯进行数字的显示。 此类的定义如下: public abstract class Number...

iteye_18817的博客 625

BigDecimalNumberFormat四舍五入的区别

2017/9/19 李国帅 qq9611153 在android中使用到四舍五入,提取出来写成了两个函数,方便使用   public static String formatDouble(int digits, Double value) { NumberFormat ddf2 = NumberFormat.

lgs7907 872

Android 开发过程中应该怎样防止内存泄漏

Android 开发过程中该怎样防止内存泄漏 关于内存泄漏内存溢出的优化方式已经有很多,也有很多关于内存泄漏检测工具如 LeakCanary ,但这是在 App 发布或调试之后运行到某处才能检测出。那么实际上,我们在编码过程当中也可以规范自己的编码方式,在可能发生内存方面问题的候多细心一点。下面就来简单介绍下。 常见的内存泄露产生条件与解决方法 在 Android 程序开发中,当一个对...

付小华的博客 811

linux c代码调试工具,基于c语言中调试工具的用法汇总(不包含gdb)

是不是只有编译的候才知道程序写了错误?有没有在未编译的候就让机器帮你检查错误的工具呢?答案是:有!!splint工具.用一个最简单的HELLO WORLD来表述:=====================================/*错误很明显*/#include int main(void){print("hello world\n", s);return}--------------...

weixin_36035610的博客 323

内存泄漏

内存泄漏简介泄漏原因产生方式的分类检测方法静态分析技术源代码插装技术目标代码插装技术被测代码预处理测试执行阶段数据统计与结果汇总检测工具部分工具参考资料 简介 内存泄漏(Memory Leak)是指程序中已动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果。 内存泄漏缺陷具有隐蔽性、积累性的特征,比其他内存非法访问错误更难检测。因为内存泄漏的产生原因是内存块未被释放,属于遗漏型缺陷而不是过错型缺陷。此外,内存泄漏通常不会直接产生可观察的错误症状

weixin_54429813的博客 461

C++入门——内存泄漏

内存泄漏 概念 内存泄漏(memory leak),是指由于疏忽或错误造成程序未能释放已经不再使用的内存的情况。一般常说的内存泄漏是指堆内存的泄漏。 内存泄漏其实并非指内存在物理上的消失,而是应用程序分配某段内存后,由于设计错误,失去了对该段内存的控制,因而造成了内存的浪费。 内存泄漏与许多其他问题有着相似的症状,并且通常情况下只能由可以获得程序源代码的程序员才可以分析出来 应用程序一般使用malloc、calloc、realloc、new等函数从堆中分配到一块内存,使用完后,程序必须负责相

beilizhang的博客 452

避免android程序开发内存泄漏-context

Android 应用程序被限制最多使用16MB的堆空间,至少在T-Mobile G1上是这样。这对电话而言是很多空间,但对目前程序员想要得到的而言却很少的可怜。哪怕你没有打算使用这些给定的空间。你也应该尽可能的少用而留给其他应用程序更多的空间以免他们挂了。Android在内存中能

wan的专栏 528

内存泄漏详解

简介 内存泄漏(Memory Leak)是指程序中己动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果。 内存泄漏缺陷具有隐蔽性、积累性的特征,比其他内存非法访问错误更难检测。因为内存泄漏的产生原因是内存块未被释放,属于遗漏型缺陷而不是过错型缺陷。此外,内存泄漏通常不会直接产生可观察的错误症状,而是逐渐积累,降低系统整体性能,极端的...

Zhanganliu的博客 926

内存泄漏及管理--程序开发注意的问题

一。何为内存泄漏     我们常说的内存泄漏通常指堆内存的泄漏,指我们的程序从堆中分配,使用完必须由程序显示地释放的内存。通常由程序中的malloc、realloc、new等函数分配的内存。在使用完后必须通过free/delete释放该内存块。如果该内存块不再访问却未被释放这就是我们通常所说的内存泄漏,而广义的内存泄漏不仅仅指堆内存的泄漏,还包括系统资源的申请释放,如socket及文件描述符、

1123

常见的内存泄漏

常见的内存泄漏 在android程序开发中,当一个对象已经不需要再使用了,本该被回收,而另外一个正在使用的对象持有它的引用从而导致它不能被回收,这就导致本该被回收的对象不能被回收而停留在堆内存中,内存泄漏就产生了。 内存泄漏有什么影响呢?它是造成应用程序OOM的主要原因之一。由于android系统为每个应用程序分配的内存有限,当一个应用中产生的内存泄漏比较多,就难免会导致应用所需要的内存超过这个系统分配的内存限额,这就造成了内存溢出而导致应用Crash。 了解了内存泄漏的原因及影响后,我们需要做的就是掌

weixin_45684308的博客 193

内存泄漏android11,Android常见的几种内存泄漏小结

一、背景最近在项目的版本迭代中,出现了一些内存问题的小插曲,然后自己花了一些间优化了APP运行内存大小的问题,特此做个总结,与大家分享。二、简介在Android程序开发中,当一个对象已经不需要再使用了,本该被回收,而另外一个正在使用的对象持有它的引用从而导致它不能被回收,这就导致本该被回收的对象不能被回收而停留在堆内存中,内存泄漏就产生了。内存泄漏有什么影响呢?它是造成应用程序OOM的主要原...

weixin_42641741的博客 435

Android 内存泄漏OOM分析(一)

OOM(内存溢出),内存泄漏

永远不要停下学习的脚步。 5656

Android开发过程中比较常见的内存泄漏现象及相应的解决办法

在Android开发中,内存泄漏是比较常见的问题,有过一些Android编程经历的童鞋应该都遇到过,但为什么会出现内存泄漏呢?内存泄漏又有什么影响呢? 在Android程序开发中,当一个对象已经不需要再使用了,本该被回收,而另外一个正在使用的对象持有它的引用从而导致它不能被回收,这就导致本该被回收的对象不能被回收而停留在堆内存中,内存泄漏就产生了。 内存泄漏有什么影响呢?它是造成

lvshuchangyin的专栏 2377

Android开发中常见的内存泄漏情况解决办法

什么是内存泄漏? 答:在Android程序开发中,当一个对象已经不需要再使用了,本该被回收,而另外一个正在使用的对象持有它的引用从而导致它不能被回收,这就导致本该被回收的对象不能被回收而停留在堆内存中,内存泄漏就产生了。 内存泄漏的危害? 答:它是造成应用程序OOM的主要原因之一。由于Android系统为每个应用程序分配的内存有限,当一个应用中产生的内存泄漏比较多,就难免会导致应用所需要...

da_caoyuan的博客 5917

内存泄漏基本理论

内存泄漏(Memory Leak)是指程序中己动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果。 中文名 内存泄漏 外文名 Memory Leak 内存泄漏简介 内存泄漏(Memory Leak)是指程序中己动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重...

不倒的向日葵 469

android context 内存泄漏,android Context 持有导致的内存泄漏

Context使用场景为了防止Activity,Service等这样的Context泄漏于一些生命周期更长的对象,可以使用生命周期更长的ApplicationContext,但是不是所有的Context的都能替换为ApplicationContexte.g.在 Activity 中声明一个静态变量引用了 Activity 自身,就会造成内存泄漏:这样的代码会导致当这个 Activity 结束的候...

weixin_29055699的博客 787
上一篇: 最近的工作总结
JavaSantosh
博客等级 码龄12年 0粉丝 6原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值