【问题标题】:How to cap a double's precision to a precision given in the form of 0.00...1?如何将 double 的精度限制为以 0.00...1 的形式给出的精度?
【发布时间】:2018-01-08 18:59:47
【问题描述】:

我有一个奇怪的问题,即必须将双精度数的精度限制为小数位数,或者根本没有小数位,精度是这样交给我的:0.001、0.1、1、0.00001 等.

例如,我可以得到 1.234247324 和 0.001 的精度指标,因此我需要返回 1.234。如果相反,我得到了 1.0 的精度,那么我将返回 1(没有小数位),依此类推。

我不知道该怎么做。有没有人指点如何解决这个问题?

谢谢!

【问题讨论】:

标签: java math precision arithmetic-expressions rounding


【解决方案1】:

从你的值开始,创建一个 BigDecimal,然后四舍五入到你想要的。

double value = 1.23456; //not actually equal to that, but pretend.
BigDecimal better = new BigDecimal(value);
BigDecimal rounded = better.round(new MathContext(3));

Rounded 现在是您想要的实际值。精度指示器可以做什么?

BigDecimal precision = new BigDecimal("0.001");

现在您可以获得精度的比例,您可以将其用于舍入。

System.out.println(precision.scale());
//outputs 3.

这类似于使用对数。

【讨论】:

  • 我明白了,也感谢您更新答案,它帮助我理解了为什么这是一个更好的方法。 o/
  • @EdyBourne 很高兴它有帮助,了解您的要求有点困难。因此,如果事实证明这不是您所需要的,请返回并编辑您的问题,使其看起来不像经典的浮点精度问题。
【解决方案2】:

使用其他两个答案的混合方法可以指定不寻常的精度,例如 0.25

BigDecimal rounded = (x / precision).round(new MathContext(0)) * precision;

【讨论】:

    【解决方案3】:

    试试这个代码

    double x = 1.234247324;
    double p = 0.001;
    double y = (int)(x * 1 / p) / (1 / p);
    

    不太明白你想做什么,但结果为 1.234。

    【讨论】:

    • @EdyBourne 这是不正确的。 double 不是这样存储的。我给你贴一个大的十进制例子。
    • @Edy Bourne 如果您想要高精度,请使用BigDecimal 否则只需使用简单的浮点运算。
    • 这是正确的,因为它将x 舍入到最接近的(double) 0.001 倍数。当然,(double) 0.001 不完全是 1/1000。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-30
    • 2020-06-02
    • 2017-11-15
    相关资源
    最近更新 更多