2

我正在使用 java 并指的是“双”数据类型。为了简短起见,我正在从标准输入中读取一些值,这些值在我的代码中作为双精度值读取(我更愿意使用 BigInteger 之类的东西,但现在不可能)。

我希望从用户那里获得双精度值,但有时他们可能会输入以下内容:999999999999999999999999999.9999999999 我认为这超出了双精度的准确表示,并且四舍五入到 1.0E27(可能)。

我想获得一些关于如何检测特定值是否无法以双精度表示并需要四舍五入的指示(以便我可以拒绝该值或其他此类操作)。

非常感谢你

4

3 回答 3

4

人类输入的大多数值都不能用双精度表示。

例如,您是否要阻止用户输入 0.1?这不能完全表示为双精度数。

要查找错误的规模,您可以执行以下操作:

BigDecimal userAsDecimal = new BigDecimal(userInput);
double userAsDouble = double.parseDouble(userInput);
BigDecimal doubleToDecimal = new BigDecimal(userAsDouble);
BigDecimal error = userAsDecimal.subtract(userAsDouble).abs();

然后检查“错误”是否小到可以接受的程度。

于 2008-11-06T13:21:42.523 回答
2
double orig = GetSomeDouble();
double test1 = orig - 1;
if ( orig == test1 )
   SomethingIsWrong();
double test2 = test1 + 1;
if ( orig != test2 )
   SomethingIsWrong();
于 2008-11-06T13:22:58.743 回答
1

您不能使用双精度来精确地按照您要求的方式存储某些内容,用户很少会输入双精度可以完美表示的数字,但这只是巧合。如果您需要存储确切的数字,只要您不需要进行任何操作,您就可以使用字符串。如果您需要更多,那么可能有一些库是为这种精确的数学而设计的。

于 2008-11-06T13:40:52.313 回答