0

我在 java 中舍入 BigDecimals 时遇到了一些麻烦。我正在尝试将值从英尺转换为英寸,反之亦然,这就是我所拥有的:

//To convert from ft to in;
//...
BigDecimal CINCH = new BigDecimal("12");
Inch.setText(CINCH.multiply(VFEET).toString()); //VFEET is the user input

//To convert from in to ft
//...
BigDecimal CFEET = new BigDecimal("12"); //Initially I multiplied the input with 0.0833333333
Feet.setText(VINCH.divide(CFEET, 7, RoundingMode.HALF_UP).toString());  //VINCH is the user input

如果我尝试将 1 英尺转换为英寸,它将返回预期值 (12)。如果我尝试将 12 英寸转换为英尺,它会返回预期值 (1),但会像我预期的那样使用 7 位小数。

如果我将 1 英寸转换为英尺,它返回 0.08333333,如果我将此值从英尺转换为英寸,它应该返回 1,但它返回 0.9999996。如果我将 2 英寸转换为英尺,则返回 0.1666667,如果我将此值从英尺转换为英寸,则返回 2.0000004

我怎样才能解决这个问题?(我知道我可以用双打来做到这一点,这是我的第一个计划,但我遇到了一个准确性问题(比这个更大))

4

1 回答 1

0

但是,选择用于表示的数据类型应该反映要解决的潜在问题。通常对于测量,您会使用双精度数,因为测量的精度通常低于表示的精度。在这种情况下,表示中的错误不太重要。通常,您还将处理比例相似的测量值,其中两个值之间的差异不接近表示的精度。在您的情况下,您似乎需要比双精度表示的精度更高,但不希望数字显示为小数允许的精度。

一种可能的解决方案是在内部保持比您显示的更精确的值。无论类型如何,这都适用,但可以使用您的示例轻松演示decimal. 例如(在 C# 中)

decimal f = 1m;
decimal i = f / 12m;

Console.WriteLine("{0} {1} {2} {3}", f, i, i * 12m, Math.Round(i * 12m, 7));

产生以下输出,您可以在其中看到通过显示更少的数字,我们得到了预期的答案

1 0.0833333333333333333333333333 0.9999999999999999999999999996 1.0000000

我的建议是以较高的精度进行算术运算,以较低的精度进行显示。在您的情况下,您正在以 7 的比例进行算术,因此您可能希望在输出中最多显示 6 位精度,或者相反将比例设置得更高,以便您可以显示与测量结果一样多的精度。

您可能还会发现BigDecimal 中的 Divide 方法的 Scale()很有帮助

于 2013-07-21T15:10:31.097 回答