java 浮点数 精度_java浮点数精度问题解决方法_赵有名的博客-程序员宅基地

技术标签: java 浮点数 精度  

import java.math.BigDecimal;

/**

* 由于Java的简单类型不能够精确的对浮点数进行运算,这个工具类提供精 确的浮点数运算,包括加减乘除和四舍五入。

*/

public class Arith {

// 默认除法运算精度

private static final int DEF_DIV_SCALE = 10;

// 这个类不能实例化

private Arith() {

}

/**

* 提供精确的加法运算。

*

* @param v1

* 被加数

* @param v2

* 加数

* @return 两个参数的和

*/

public static double add(double v1, double v2) {

BigDecimal b1 = new BigDecimal(Double.toString(v1));

BigDecimal b2 = new BigDecimal(Double.toString(v2));

return b1.add(b2).doubleValue();

}

/**

* 提供精确的减法运算。

*

* @param v1

* 被减数

* @param v2

* 减数

* @return 两个参数的差

*/

public static double sub(double v1, double v2) {

BigDecimal b1 = new BigDecimal(Double.toString(v1));

BigDecimal b2 = new BigDecimal(Double.toString(v2));

return b1.subtract(b2).doubleValue();

}

/**

* 提供精确的乘法运算。

*

* @param v1

* 被乘数

* @param v2

* 乘数

* @return 两个参数的积

*/

public static double mul(double v1, double v2) {

BigDecimal b1 = new BigDecimal(Double.toString(v1));

BigDecimal b2 = new BigDecimal(Double.toString(v2));

return b1.multiply(b2).doubleValue();

}

/**

* 提供(相对)精确的除法运算,当发生除不尽的情况时,精确到 小数点以后10位,以后的数字四舍五入。

*

* @param v1

* 被除数

* @param v2

* 除数

* @return 两个参数的商

*/

public static double div(double v1, double v2) {

return div(v1, v2, DEF_DIV_SCALE);

}

/**

* 提供(相对)精确的除法运算。当发生除不尽的情况时,由scale参数指 定精度,以后的数字四舍五入。

*

* @param v1

* 被除数

* @param v2

* 除数

* @param scale

* 表示表示需要精确到小数点以后几位。

* @return 两个参数的商

*/

public static double div(double v1, double v2, int scale) {

if (scale < 0) {

throw new IllegalArgumentException(

"The scale must be a positive integer or zero");

}

BigDecimal b1 = new BigDecimal(Double.toString(v1));

BigDecimal b2 = new BigDecimal(Double.toString(v2));

return b1.divide(b2, scale, BigDecimal.ROUND_HALF_UP).doubleValue();

}

/**

* 提供精确的小数位四舍五入处理。

*

* @param v

* 需要四舍五入的数字

* @param scale

* 小数点后保留几位

* @return 四舍五入后的结果

*/

public static double round(double v, int scale) {

if (scale < 0) {

throw new IllegalArgumentException(

"The scale must be a positive integer or zero");

}

BigDecimal b = new BigDecimal(Double.toString(v));

BigDecimal one = new BigDecimal("1");

return b.divide(one, scale, BigDecimal.ROUND_HALF_UP).doubleValue();

}

}

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_29422697/article/details/114425192

智能推荐

VC常用小知识_冷月宫主的博客-程序员宅基地

(1) 如何通过代码获得应用程序主窗口的 指针?主窗口的 指针保存在CWinThread::m_pMainWnd中,调用AfxGetMainWnd实现。AfxGetMainWnd() ->ShowWindow(SW_SHOWMAXMIZED)//使程序最大化.(2) 确定应用程序的路径Use GetModuleFileName 获得应用程序的路径,然后去掉可执行文件名。

Kafka源码工程examples项目配置log4j_weixin_30725467的博客-程序员宅基地

examples项目启动想知道有哪些错误,通过日志了解代码执行逻辑,但是启动SimpleConsumerDemo了报错如下:log4j.proproties也配置了log4j.proproties配置如下:# Licensed to the Apache Software Foundation (ASF) under one or more# contributor l...

GObject对象系统_weixin_34204722的博客-程序员宅基地

2019独角兽企业重金招聘Python工程师标准&gt;&gt;&gt; ...

LocalDateTime的使用_Yue Qin的博客-程序员宅基地_localdatetime使用

LocalDateTime是jdk8时间类API,与Date不同的是,LocalDateTime更为强大可以设置时区Zone和时差ZoneOffset。类似比较如下:Instant类似于DateLocalDateTime 类似于CalendarDateTimeFormatter类似于SimpleDateFormat一、Date与LocalDateTime之间的转换Date &lt;--------&gt; Instant &lt;-------&gt; ZonedDateTime &lt;

安装JDK13没有jre问题_yolanda-123456的博客-程序员宅基地_安装的jdk没有jre会有什么后果

第一步:直接在电脑搜索框中,输入“cmd”,以管理员身份运行。第二步:进入JDK安装目录cd C:\Program Files\Java\jdk-13.0.2第三步:执行命令后,再次打开JDK目录就可以看到jre文件备注:必须已管理员身份输入命令才不会报错。...

服务器下把权限修改器,APK Permission Remover|APK权限修改器去签名验证_weixin_39985279的博客-程序员宅基地

[JavaScript] 纯文本查看 复制代码#v5=(Conflicted);const-string v4, "testkey"invoke-static {v0, v4}, Landroid/support/v4/a/a;-&gt;c(Landroid/content/Context;Ljava/lang/String;)Ljava/lang/String;#直接把move-result-o...

随便推点

原型模式_weixin_30399155的博客-程序员宅基地

比较简单,主要用到clone()大同小异的工作周报Sunny软件公司一直使用自行开发的一套OA (Office Automatic,办公自动化)系统进行日常工作办理,但在使用过程中,越来越多的人对工作周报的创建和编写模块产生了抱怨。追其原因,Sunny软件公司的OA管理员发现,由于某些岗位每周工作存在重复性,工作周报内容都大同小异,如图7-1工作周报示意图。这些周报只有一...

Linux环境下Darknet的安装与测试_pzb19841116的博客-程序员宅基地_linux安装darknet

1.下载Darknet源码sudo git clone https://github.com/pjreddie/darknet2.编译Darknet源码cd darknetmake3.下载权重文件yolov3.weights,放入到darknet文件夹下下载地址:https://pjreddie.com/media/files/yolov3.weights4.修改cfg文件夹下的yolov3.cfg文件,原文件是训练模式,需要改成测试模式。具体修改方法是,打开Tes

springboot系类代码:org.springframework.boot-quickstart_咔啡的博客-程序员宅基地

spring-boot-starter 是SpringBoot的核心启动类、支持自动装配、日志和YAML文件格式SpringBoot在编译的时候是用Jdk1.8的版本加载配置文件的命名格式支持3种:1、.yml 2、 .yaml 3、.properties而且注意的是配置文件可以在/src/main/resources下有多层目录结构但是命名必须以application开头的才行,不然就会加载不到报错package org.programb.springboot;import org.s.

python计算平方用map函数_map函数的使用技巧_f飞姐的博客-程序员宅基地

js的Array数组对象中有很多有用的方法,js的map函数在某些方面非常的方便强大。map() 方法创建一个新数组,其结果是该数组中的每个元素都调用一个提供的函数后返回的结果。let numbers = [1, 5, 10, 15];let roots = numbers.map((x) =&gt; {return x * 2;});let roots = numbers.map( x =&gt...

linux获得wwn_weixin_34404393的博客-程序员宅基地

在IBM DS4000/DS500存储LUN与主机的map时,需要先知道主机的WWN,在LINUX可通过如下方式获得:To get the WWNN (World Wide Node Number) in Linux:mytestsrv1# cat /sys/class/fc_host/host0/node_name0x20000000c9538d83mytestsrv1#...

centos 7.2 linux版本,离线将CentOS系统从 7.2版本升级至7.5版本_weixin_39982580的博客-程序员宅基地

1.查看系统版本操作命令cat/etc/centos-release显示结果CentOSLinuxrelease7.5.1804(Core)2.准备工作CentOS 7.5版本的镜像包 下载链接:https://www.centos.org/download/USBWriter软件 下载链接:https://sourceforge.net/projects/u...

推荐文章

热门文章

相关标签