`

java处理高精度的商业计算

    博客分类:
  • JAVA
阅读更多
在公司写代码时,发现从mongodb中取出高精度数据时,会自动转成科学计数法!
例如数据库里存的是`0.0002`,取出来时,变成了2.0E-4.

对于这种高精度的数据,一般要用到BigDecimal类。


一般我们都是保留两位小数,但是如上例中,`0.0002`我们希望保留的有效位,是从非0位2开始
的。我们该怎么写呢?
double a = 0.0002;  
BigDecimal b = new BigDecimal(String.valueOf(a));  
BigDecimal divisor = BigDecimal.ONE;  
MathContext mc = new MathContext(2);  
System.out.println(b.divide(divisor, mc));
  • 1
  • 2
  • 3
  • 4
  • 5
上面代码的意思:用一个`BigDecimal`对象除以`divisor`后的结果,并且要求这个结果保留
有mc个小数位。其中`BigDecimal.ONE`的值就是1。(0.0002/1保留2位有效小数)
尽量使用参数类型为String的构造函数。


这里要说明下:
不要写成这样:
double a = 0.0002;  
BigDecimal b = new BigDecimal(String.valueOf(a));
BigDecimal setScale = bigDecimal.setScale(2);
System.out.println(setScale);
  • 1
  • 2
  • 3
  • 4
这样会保存会报错,因为它的保存方式不会去管,小数点后面的开始位是不是为0。假设它强行截
取得话(我们假设它不报错),就变成了0.00。就更不对啦

网上参考信息:

方法一:
scale指的是你小数点后的位数。比如123.456则score就是3.
score就是BigDecimal类中的方法啊。
你自己定义一个BigDecimal的对象调用一下就可以验证。
比如:BigDecimal b = new BigDecimal("123.456");
b.scale(),返回的就是3.

方法二:
roundingMode是小数的保留模式。它们都是BigDecimal中的常量字段,你可以看一下,有很
多种。
比如:BigDecimal.ROUND_HALF_UP表示的就是4舍5入。

`pubilc BigDecimal divide(BigDecimal divisor, int scale, int roundingMode)`
的意思是说:我用一个BigDecimal对象除以divisor后的结果,并且要求这个结果保留有
scale个小数位,roundingMode表示的就是保留模式是什么,是四舍五入啊还是其它的,你可
以自己选!

如果我们后台不转换的话,放到前台转也可以的。前台使用Number(),就可以把科学计数表示法
转成正式显示

参考地址

http://bbs.csdn.net/topics/360022861 
http://blog.csdn.net/jackiehff/article/details/8582449 
http://blog.csdn.net/wangxy799/article/details/51769251

分享到:
评论

相关推荐

    【项目实践】商业计算怎样才能保证精度不丢失(csdn)————程序.pdf

    1. **Decimal类型**:这是专门为商业计算设计的高精度数据类型。在数据库层面,如MySQL或SQL Server,可以使用`decimal(M,N)`类型,其中`M`表示总位数,`N`表示小数位数。例如,`decimal(20,2)`可以存储最多20位数字...

    DecimalFormat精度解决,商业运算精度问题

    它能够提供对非常大的数字以及需要高度精确的计算的支持,非常适合用于财务和商业计算场景。 ### `BigDecimal`类的基本用法 1. **构造方法**: - `BigDecimal(double val)`:通过一个`double`值创建`BigDecimal`...

    JAVA浮点数计算精度损失底层原理与解决方案

    在进行商业计算或者需要精确结果的场景中,推荐使用`BigDecimal`。例如,在相加、相减、相乘和相除操作时,可以将输入的浮点数先转换为字符串,然后用`BigDecimal`对象进行运算,最后再转换回`double`。示例代码如下...

    java中BigDecimal的操作方法

    在Java编程语言中,BigDecimal是用于处理高精度和可配置精度的十进制数的类。在进行商业计算时,由于浮点数(double和float)存在精度问题,不能保证准确的结果,因此通常推荐使用BigDecimal来确保计算的精确性。本文...

    java_calculator2.rar_java 计算器_java 计算器

    10. **数据类型**:理解并使用适当的Java数据类型,如`int`、`double`,确保计算的精度和范围。 综上所述,这个"java_calculator2"项目不仅展示了Java编程的基本概念,还可能涉及到了面向对象设计、异常处理、用户...

    s2-geometry-library-java,从code.google.com/p/s2-geometry-library-java自动导出.zip

    5. **距离和面积计算**:S2库提供了球面上的精确距离计算,即使在极地附近也能保持精度。同时,它还可以计算球面上的准确面积,克服了经纬度坐标系统在大范围区域计算时的不准确性。 6. **API友好**:S2库的Java...

    ACL大数计算

    总的来说,ACL大数计算提供了一种高效、灵活的方式来处理超出常规整型范围的大整数,使得在各种需要高精度计算的场景中能够实现准确无误的运算。无论是学术研究还是商业应用,ACL大数计算都是解决大数据问题的强大...

    Java中BigDecimal类的简单用法

    总之,Java中的BigDecimal类是处理精确数值计算的重要工具,尤其是在金融、会计等对精度要求极高的领域。通过使用其提供的各种构造方法和运算方法,开发者可以有效地控制计算过程中的精度,确保计算结果的正确性。...

    LBPS.zip_java 蓝牙定位_定位_蓝牙 定位_蓝牙 精确定位_蓝牙定位

    在IT行业中,蓝牙定位是一种基于蓝牙技术的无线定位方法,尤其在室内环境中...开发这样的系统涉及蓝牙通信、信号处理、定位算法等多个技术领域,需要综合运用多种知识,但其潜在的商业价值和用户体验提升是值得投入的。

    Java BigDecimal使用及基本运算(推荐)

    BigDecimal 类在 Java 中是用于处理高精度和大数值计算的,它确保了在计算过程中不会因为浮点数的精度问题而导致结果错误。由于 double 和 float 类型在处理大数或需要绝对精确计算的场景下存在精度损失,因此 ...

    北邮计算机组成原理课后答案(白中英版)

    - 通用计算机:可以执行多种类型的计算任务,灵活性强,广泛应用于科学研究、商业计算等领域。 3. **计算机的应用领域**: - 科学计算:用于复杂的数学和物理计算。 - 自动控制:应用于工业生产线、智能家居等。...

    JAVA0825.docx

    7. `BigDecimal`和`DecimalFormat`:这两个类用于高精度的数值计算。`BigDecimal`解决了`double`类型的精度问题,适合金融和商业计算。`DecimalFormat`是格式化数字的工具,可以定制输出的格式。 8. `Math`类:提供...

    处理较大数字的PHP库.zip

    一般的float型和Double型数据只可以用来做科学计算或者 是工程计算,由于在商业计算中,要求的数字精度比较高,所以要用到java.math.BigDecimal类,它支持任何精度的定点数,可以用它来精确 计算货币值。

    并行程序开发工具与高性能程序库_张林波_并行计算导论1

    并行程序开发工具与高性能程序库是现代计算领域的重要组成部分,尤其在大数据处理和高性能计算中扮演着不可或缺的角色。本文将详细介绍一个基础的并行计算概念——BLAS(Basic Linear Algebra Subroutines)及其在高...

    Java基础教程

    `float`和`double`是最常用的两种浮点类型,其中`double`精度更高。 - **字符型**:用于存储单个字符。Java使用Unicode标准,因此一个`char`类型变量可以存储任何Unicode字符。 - **布尔型**:用于表示逻辑值,只能...

    大数据处理系统模式及其应用探讨.pdf

    1. 分布式处理模式(MPP):大规模并行处理(Massively Parallel Processing)是一种常用的分布式处理架构,它可以同时在多个处理单元上执行计算任务。MPP系统针对大数据量的并行处理优化,具有强大的数据处理能力,...

    商业编程-源码-《电子尺》V1.07程序源代码.zip

    开发者可能使用了高精度计算库,如MPFR,来确保测量结果的准确性。 对于商业环境,软件的性能和稳定性至关重要。因此,源代码中可能有各种优化策略,如多线程并行计算以提高效率,异常处理机制以增强软件的健壮性。...

    OpenCVNonFree

    OpenCVNonFree是一个基于OpenCV库的扩展模块,专注于提供一些高级图像处理功能,特别是那些在OpenCV核心库中未包含的商业或受限制的算法。这个模块包含了Java接口,使得开发者可以方便地在Java环境中利用这些功能...

    GeographicLib库(1.52)

    版本1.52对之前的版本进行了多方面的优化,包括提高计算精度、修复已知问题以及更新了地球模型数据。这些改进确保了GeographicLib在现代地理信息系统中的可靠性和准确性。 总结,GeographicLib库1.52版是一个强大且...

    (完整版)JAVA+WEB毕业课程设计.docx

    **技术可行性**上,该系统依赖于现有的计算机硬件和软件技术,如网络Internet技术,利用计算机的高速信息传输和高精度处理能力。随着Java和MySQL等成熟开发工具的发展,构建这样一个系统的技术障碍已大大降低,同时...

Global site tag (gtag.js) - Google Analytics