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


相关推荐

  • SSL协议详解「建议收藏」

    SSL协议详解「建议收藏」SecureSocketsLayerSSL协议概述SSL解决的问题(功能)协议的使用SSL在协议栈的位置SSL协议的分层模型SSL体系结构SSL的两个重要概念主要工作流程SSL握手协议的握手过程SSL记录层的功能SSL协议脆弱性分析SSL协…

    2022年6月2日
    31
  • Topk算法_topn算法

    Topk算法_topn算法topK算法思路1:可以采用快速选择算法,借助快排,设mid为每次划分中间结果,每次划分完之后如果mid==k,则说明序列刚刚好,第k位置和他前面的位置都是前K大的数,如果mid < k,则说明第K大的元素在后半部分,则前半部分肯定是前K大的数,只需从后半部分找k – mid大的数即可,否则如果mid > k,则说明第K大的数在前半部分,只需从前半部分找前K大的数字即可。时间复杂度:假设每次划分的mid都在中间,每层都只是对一半做划分,所以每次划分的数据量为n,n/2,n/4,n/8…一

    2022年8月8日
    4
  • 系统结构-并行算法FORK JOIN[通俗易懂]

    系统结构-并行算法FORK JOIN[通俗易懂]并行算法FORKJOIN一、FORKJOIN定义二、举例题目分析:一、FORKJOIN定义FORK语句的形式:FORKm,其中m为新进程开始的标号。执行FORKm语句时,派生出标号为m开始的新进程,具体为:1、准备好这个新进程启动和执行所必需的信息;2、如果是共享主存,则产生存储器指针、映像函数和访问权数据;3、将空闲的处理机分配给派生的新进程,如果没有空闲处理机,则让它们排队等待;4、继续在原处理机上执行FORK语句的原进程。与FORK语句相配合,作为每个并发进程的终端语句J

    2022年9月20日
    0
  • XML简单入门_XML文件都有哪些应用

    XML简单入门_XML文件都有哪些应用XML作用用来保存数据,而且这些数据具有自我描述性它还可以作为项目或模块的配置文件还可以作为网络传输数据的格式(JSON现在为主)语法4. 文档声明5. 元素(标签)6. xml属性7. xmll注释8. 文本区域<?xml version=”1.0″ encoding=”utf-8″ ?><!–文档声明–><books> <book sn = “SN12345648987”> <name>

    2022年8月8日
    2
  • java冒泡排序经典代码_java冒泡排序[通俗易懂]

    java冒泡排序经典代码_java冒泡排序[通俗易懂]经典算法——冒泡排序(BubbleSort)一、示例代码(伸手党看这里)1.示例一importjava.util.Arrays;publicclassBubbleSort{publicstaticvoidbubbleSort(int[]arr){inttemp;/*临时变量,交换数据时使用*/intlength=arr.length;for(intp=length-1…

    2022年6月22日
    36
  • 能关闭一切进程的无敌命令

    能关闭一切进程的无敌命令

    2021年7月29日
    354

发表回复

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

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