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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • web安全色_WEB标准颜色

    web安全色_WEB标准颜色web安全色产生的原因不同的平台(Mac、PC等)有不同的调色板,不同的浏览器也有自己的调色板。这就意味着对于一幅图,显示在Mac上的Web浏览器中的图像,与它在PC上相同浏览器中显示的效果可能差别很

    2022年8月1日
    7
  • 最长上升子序列 LIS算法实现[通俗易懂]

    最长上升子序列 LIS算法实现[通俗易懂]最长上升子序列LIS算法实现LIS(LongestIncreasingSubsequence)最长上升(不下降)子序列有两种算法复杂度为O(n*logn)和O(n^2)。在上述算法中,若使用朴素的顺序查找在D1..Dlen查找,由于共有O(n)个元素需要计算,每次计算时的复杂度是O(n),则整个算法的时间复杂度为O(n^2),与原来算法相比没有任何进步。但是由于D的特点(2),在D中查…

    2022年6月5日
    24
  • windows server 禁用智能卡服务的步骤

    windows server 禁用智能卡服务的步骤许多用户对于系统中的很多功能都不太了解,其中智能卡服务更是少有人知。智能卡服务就是对插入的智能卡进行管理和访问控制,大多数用户都无需使用此项功能。那么在Win7系统中要怎么取消智能卡服务呢?1.首先

    2022年7月1日
    32
  • SDL2来源分析7:演出(SDL_RenderPresent())

    SDL2来源分析7:演出(SDL_RenderPresent())

    2022年1月10日
    54
  • Java 数组

    Java 数组

    2021年10月7日
    39
  • linux流量分析「建议收藏」

    linux流量分析「建议收藏」目录1.案例分析2.命令详解1.案例分析查看流量端口号sudoiftop-i-Pn->显示主机ip和主机名 N->显示端口号或者端口服务名称 P->暂定或者继续根据端口号查询进程netstat-nap|grepport查看进程信息:ps-aux|greppid2.命令详解2.1iftop2.1.1运行if…

    2022年5月8日
    68

发表回复

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

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