当前位置: 首页 > 知识库问答 >
问题:

Java BigDecimal错误,字符串构造函数使用ROUND\u HALF\u向上舍入

段干玺
2023-03-14

我正在尝试实现一个新的等级舍入到BigDecimal类,并且我得到了一个可能的错误,一定是我做错了什么。下面的代码暴露了我的问题:

public static void main(String[] args) throws IOException {
    BigDecimal valDouble = new BigDecimal(0.35);
    valDouble = valDouble.setScale(1, BigDecimal.ROUND_HALF_UP);
    System.out.println(valDouble.doubleValue()); // prints 0.3

    BigDecimal valString = new BigDecimal(new String("0.35"));
    valString = valString.setScale(1, BigDecimal.ROUND_HALF_UP);
    System.out.println(valString.doubleValue()); // prints 0.4
}

我的疑问是,BigDecimal对于double和String构造函数是否不同?

我不能理解这个“bug”,至少,我只是用了一个简单的字符串conat来“解决”它,如下所示:

BigDecimal valDouble = new BigDecimal("" + 0.35);

知道是什么导致了这种奇怪的行为吗?

共有3个答案

楚承天
2023-03-14

0.35已经不精确,成为FP的二进制基数。使用新的BigDecimal(“0.35”),这是精确的,因为它是十进制基数。

甄越
2023-03-14

你不需要猜测0.35代表什么

BigDecimal valDouble = new BigDecimal(0.35);
System.out.println(valDouble);

印刷品

0.34999999999999997779553950749686919152736663818359375

这将四舍五入到小数点后1位,即0.3

您不需要转换为字符串,可以使用valueOf

BigDecimal valDouble = BigDecimal.valueOf(0.35);
System.out.println(valDouble);

印刷品

0.35

要将二分之一四舍五入到小数点后一位,可以使用

double d = 0.35;
double d1 = Math.round(d * 10) / 10.0;
System.out.println(d1);

印刷品

0.4
沈嘉瑞
2023-03-14

这不是一个错误。0.35作为一个双字面表示一个不完全等于0.35的值;它可能类似于0.349999995之类的东西。所以它向下舍入。

字符串构造函数允许您使用“0.35”精确地指定0.35,这将四舍五入。

不要在此处使用双构造函数;当使用BigDecimal足够重要时,您需要远离浮点land。

 类似资料:
  • 我正在做一项关于使用结构化/半结构化/非结构化数据的作业,我正在对莎士比亚的戏剧进行字数统计(以了解语言如何随时间变化),方法是导入每部戏剧的txt文件和xml索引文件,该文件存储有关每部戏剧的关键信息,如编写年份、角色列表等。。然后,我将删除字符名、设置、标点符号和常用词(和、但、或,如果等…)从txt文件准备好进行字数统计-全部在C#中运行的控制台脚本中。我正在编写一个类,每个剧本的数据都将存

  • 我最近了解了Java字符串池,有几件事我不太明白。 使用赋值操作符时,如果字符串池中不存在新字符串,则将在字符串池中创建新字符串。 当使用String构造函数时,我明白无论String池的状态如何,都将在堆中、String池之外创建一个新字符串。 我在某处读到过,即使在使用构造函数时,也在使用字符串池。它将把字符串插入到字符串池和堆中。 我没有找到任何关于这方面的进一步信息,但我想知道这是不是真的

  • 问题内容: 我正在查看String API,突然我遇到了一个String空的构造方法,即我们可以使用以下方法构造一个空的String对象: 我不知道有什么用吗? 问题答案: 当然..... 将在堆创建一个非文字串对象 ,这 将是 垃圾收集。 在哪里 将创建一个String Literal 。这 将不会被 垃圾收集过,如果是通过默认加载器访问。 看到下面这个链接,我问了一个问题。这可能与您的问题没有

  • 本文向大家介绍C#使用round函数四舍五入的方法,包括了C#使用round函数四舍五入的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C#使用round函数四舍五入的方法。分享给大家供大家参考。具体分析如下: C#中的round函数实际上不是真正的四舍五入函数,一般的程序设计语言的round函数也都不是四舍五入函数,而是银行家舍入法函数,也就是“四舍六入五考虑,五后非零就进一,五后

  • 问题内容: 我不明白原始是如何转换为char数组的。如果我尝试使用其他代码,则会引发编译错误。 问题答案: 有两个属性: 因为您位于的构造函数中,所以您有权访问其私有字段和。 您无法从String类的外部访问这些字段,因此,如果尝试执行此操作,将抛出编译错误。

  • 我想在JComboBoxe中显示我的名为CodeA(类型为String)的变量中的每个项。我有一条错误消息: 我不明白和之间的转换 编辑:在此处输入图像描述