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

减去大十进制数得到的精度为0?

仇经武
2023-03-14

我正在做两个大的十进制数的减法。在减法中,它们都具有非零精度,但结果的精度为0。

据我所知,精度为0的大十进制数是不可能的。即使0的精度也为1。

精度是未标度值中的位数。例如,对于数字123.45,返回的精度为5。

(另请参阅BigDecimal、精度和比例)。

问题区域:

BigDecimal test = (centerHP.getReal().subtract(inverseScale));

centerHP. getReal()返回从此行创建的bigDecimal

new BigDecimal(Double.toString(center.getReal()))

对于上下文<代码>中心。实数=-0.79,这是一个双精度。

所以它是有效的

new BigDecimal("-0.79")

倒标度仅为1

double scale = 1;

BigDecimal inverseScale = (BigDecimal.ONE.divide(new BigDecimal(Double.toString(scale))));

我期望test是一个值为-1.79的bigDecimal,int表示应该是-179,精度为3,刻度为2。但是,紧接着BigDecimal类中减法方法中的加法操作,我的值如下:

测试等于:

请注意,所有其他值都是正确的,只有精度似乎是错误的。

共有1个答案

巫马刚洁
2023-03-14

从该字段的javadoc中,0表示精度未知。

/**
 * The number of decimal digits in this BigDecimal, or 0 if the
 * number of digits are not known (lookaside information).  If
 * nonzero, the value is guaranteed correct.  Use the precision()
 * method to obtain and set the value if it might be 0.  This
 * field is mutable until set nonzero.
 *
 * @since  1.5
 */
private transient int precision;

方法precision()缓慢地确定精度。

public int precision() {
    int result = precision;
    if (result == 0) {
        long s = intCompact;
        if (s != INFLATED)
            result = longDigitLength(s);
        else
            result = bigDigitLength(inflate());
        precision = result;
    }
    return result;
}

 类似资料:
  • 问题内容: 当我在玩Java Puzzlers的代码(我没有书)时,遇到了这段代码 输出为 当我尝试将代码更改为 我仍然得到与 对于,输出 为,输出 为,输出为 为什么我不首先得到输出?我不能为此做出任何正面或反面吗?有人可以说清楚吗? 问题答案: 二进制0.1是0.00011001100110011001100110011001 ....., 因此,它不能精确地用二进制表示。根据四舍五入的位置(

  • 我在应用程序中使用BigDecimal 作为我的数字,例如,使用 JPA。我对术语“精度”和“规模”进行了一些研究,但我不明白它们到底是什么。 有人能解释一下BigDecimal值的“精度”和“刻度”的含义吗? 谢谢!

  • 问题内容: 如何确定整数位数和Java中类似数字的小数点后位数。 问题答案: 双精度并不总是精确的表示形式。您只能说如果将其转换为字符串,将有多少个小数位。 这仅适用于未转换为指数符号的数字。您可能会认为1.0小数点后一位或无位。

  • 当我试图从Spark dataframe收集数据时,我得到一个错误,说明 下面是StackTrace: 警告tasksetmanager:在stage 0.0中丢失任务1.0(TID 1,10..***,executor 0):java.lang.IllegalArgumentException:requirement:Decimal precision 39在scala.predef超过最大精度

  • 本文向大家介绍C#浮点,双精度,十进制,包括了C#浮点,双精度,十进制的使用技巧和注意事项,需要的朋友参考一下 示例 浮动 float是.NET数据类型的别名System.Single。它允许存储IEEE 754单精度浮点数。存在此数据类型mscorlib.dll,每个C#项目在创建它们时都会隐式引用该数据类型。 大致范围:-3.4×10 38至3.4×10 38 十进制精度:6-9个有效数字 记

  • 问题内容: 我正在尝试将双精度分隔为整数和小数部分 因此,例如,数字24.4应该分为24和4。 使用此方法可为我提供以下值: 我需要十进制的值为4。 如何解决这个问题? 问题答案: 你可以做一个String 。然后Integer 取回两个整数分量。