java double转decimal_Java中Double与BigDecimal的相互转换

java double转decimal_Java中Double与BigDecimal的相互转换今天写代码过程中,发现一个Double的变量通过newBigDecimal(Doubled)转换为BigDecimal时,有效数字改变了,如下:publicclassBigDecimalTest{publicstaticvoidmain(String[]arg){Strings1=”123.45″;Doubled1=newDouble(s1);    //使用S…

大家好,又见面了,我是你们的朋友全栈君。

今天写代码过程中,发现一个Double的变量通过new BigDecimal(Double d)转换为BigDecimal时,有效数字改变了,如下:

public class BigDecimalTest {

public static void main(String[] arg) {

String s1 = “123.45”;

Double d1 = new Double(s1);     //使用String类型的形参构造BigDecimal

BigDecimal bg1 = new BigDecimal(d1);     //使用Double类型的形参构造BigDecimal

BigDecimal bg2 = new BigDecimal(s1);

System.out.println(“bg1 = “+bg1);

System.out.println(“bg2 = “+bg2);

}

}输出:

bg1 = 123.4500000000000028421709430404007434844970703125

bg2 = 123.45

同样大小的Double数,以字符串形参的方式构造BigDecimal就能得到同样精度。而使用Double构造就会导致精度改变。事实上,按照官方API文档,推荐使用String形参的方式将float、double转换为BidDecimal,文档原文:For values other than float and double NaN and ±Infinity, this constructor is compatible with the values returned by Float.toString(float) and Double.toString(double). This is generally the preferred way to convert a float or double into a BigDecimal, as it doesn‘t suffer from the unpredictability of the BigDecimal(double) constructor。不止如此,还有以下情况:

public class BigDecimalTest {

public static void main(String[] arg) {

String s1 = “123.45”;

String s2 = “123.450”;

Double d1 = new Double(s1);

Double d2 = new Double(s2);

BigDecimal bg1 = new BigDecimal(s1);

BigDecimal bg2 = new BigDecimal(s2);

System.out.println(“d1.equals(d2): “+d1.equals(d2));

System.out.println(“bg1.equals(bg2): “+bg1.equals(bg2));

}

}Output:

d1.equals(d2): true

bg1.equals(bg2): false

同样大小的小数,有效数字不同情况下,Double类型的大小比较结果是相等的,符合我们的实际计算。但是分别转换成BigDecimal后再比较大小,得到不相等的结果。

时间: 12-15

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/144143.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 虚拟机ping不通主机,但是主机可以ping通虚拟机

    虚拟机ping不通主机,但是主机可以ping通虚拟机我在Windows10系统安装了虚拟机,设置的主机与虚拟机的连接方式是桥接,安装好后,发现虚拟机ping不通主机,但是主机可以ping通虚拟机。我的操作是:关闭防火墙,发现虚拟机可以ping通主机了。说明是Windows10防火墙阻止了。现在存在的问题是:如果我一直关闭防火墙也不是个事啊?这样做会影响我的电脑安全的。于是我想我要先确定防火墙阻止了什么,导致需要关闭防火墙?于是网上查看资…

    2022年10月23日
    0
  • js获取iframe中的内容(iframe内嵌页面)

    js如何获取包含自己iframe属性a.html如何在b.html里获取包含他的iframe的id在父页面中定义函数,再到子页面中调用。父页面parent.htmlfunctiongetFrameId(f){varframes=document.getElementsByTagName(“iframe”);//获取父页面所有iframefor(i=0;ijs怎样获取ifra…

    2022年4月18日
    1.1K
  • spring中@EventListener 的详解和使用

    spring中@EventListener 的详解和使用转载:面了个35的程序员,让我莫名的慌了。。。(欢迎关注原文作者公众号:Java充电社)面了个35的程序员,让我莫名的慌了。。。原创路人甲Java路人甲Java2020-05-10收录于话题#Spring高手系列55个内容月底免费送书活动,这两天是最后的机会,大家尽快参与!面试官:看你是85年的我:嗯,35了面试官:那应该经验很丰富了,那我们来聊聊spring吧我:好,这块我用了10几年了,你随便问吧面试官:Spring中的事件用过么?我:用过…

    2022年10月23日
    0
  • Java代码生成器——基于模板快速生成web项目结构

    Java代码生成器——基于模板快速生成web项目结构功能介绍根据数据库表的元数据生成支持Rest、RPC协议的工程服务(标准化的代码分层结构工程)。加速新工程的建设。代码结构:生成代码的结构依赖于模板的定义。本工程中定义分为三个工程${projectName}-domain-api:接口层-RPC接口API工程${projectName}-domain:领域层-RPC接口实现(包含domain层+基础设施层)${proje…

    2022年4月30日
    100
  • Git指令大全[通俗易懂]

    Git指令大全[通俗易懂]转自:https://mp.weixin.qq.com/s/sF-cx2ss4haO74K55Sjf9g配置首先是配置帐号信息ssh-Tgit@github.com#登陆github修改项目中的个人信息gitconfig–globaluser.name“githelper”gitconfig–globaluser.emailgithelper@gmail.c

    2022年5月7日
    41
  • 虚拟机VMware安装苹果系统macOS,超级详细教程,附文件下载,真教程!!

    虚拟机VMware安装苹果系统macOS,超级详细教程,附文件下载,真教程!!1.准备工作1、虚拟机VMware®Workstation15Pro,小编使用的版本是15pro2、Unlocker或MK-Unlocker3、一个MacOS镜像2.资源下载…

    2022年9月25日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号