我正在使用java并引用“double”数据类型。 为了简短起见,我正在读取标准输入中的一些值,这些值在我的代码中读取为双倍(我更喜欢使用像BigInteger这样的东西但是现在它不可能)。
我希望从用户那里获得双倍值,但有时他们可能会输入以下内容: 999999999999999999999999999.9999999999 我认为这超出了double的准确表示,并且得到了舍入到1.0E27(可能)。
我想获得一些关于如何检测特定值是否无法在双精度中准确表示并且需要舍入(以便我可以拒绝该值或其他此类操作)的指示。
非常感谢
答案 0 :(得分:4)
人类输入的大多数数值都不能用双精确表示。
例如,您想阻止用户输入0.1吗?这并不完全可以表示为双倍。
要查找错误的比例,您可以执行以下操作:
BigDecimal userAsDecimal = new BigDecimal(userInput);
double userAsDouble = double.parseDouble(userInput);
BigDecimal doubleToDecimal = new BigDecimal(userAsDouble);
BigDecimal error = userAsDecimal.subtract(userAsDouble).abs();
然后检查“错误”是否足够小。
答案 1 :(得分:2)
double orig = GetSomeDouble();
double test1 = orig - 1;
if ( orig == test1 )
SomethingIsWrong();
double test2 = test1 + 1;
if ( orig != test2 )
SomethingIsWrong();
答案 2 :(得分:1)
你不能使用双精度按照你要求的方式存储精确的东西,很少用户可以输入双精度可以完美表示的数字,但这只是巧合。如果您需要存储确切的数字,只要您不需要进行任何操作,就可以使用字符串。如果你需要更多,那么可能有一些库是为那种精确的数学运算而制作的。