2008-11-06 129 views
2

我正在使用java并引用“double”数据类型。为了保持简短,我从标准输入中读取了一些值,我在代码中读取了双精度值(我宁愿使用类似BigInteger的东西,但现在不可能)。浮点舍入检测

我希望得到来自用户的双重价值,但有时他们可能会喜欢的东西输入: 999999999999999999999999999.9999999999 我认为这是超越双准确地表述,并得到的四舍五入到1.0E27(可能)。

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

非常感谢您

回答

4

人类输入的大多数值不会与双精确表示。

例如,你想防止用户输入0.1吗?这不完全代表双倍。

要找到错误的规模,你可以这样做:

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

然后检查“错误”是否是够小。

+0

确实你是对的。 更具体地说,我总是会得到正数,最多10位数的精度,所以我的要求是限制整个部分的数字,这样它就不会导致舍入 – cupu 2008-11-06 13:25:40

+0

恐怕我还是不愿意“很明白。你的意思是你实际上只能得到整数吗?如果是这样,请使用很长时间。如果没有,我又输了... – 2008-11-06 13:34:04

+0

我已经有一个问题,提出请求 谢谢(特别是)和其他人谁回答,双是真的很糟糕在我的情况下使用......哪我一直在抱怨一段时间:)。 – cupu 2008-11-06 13:48:05

2
double orig = GetSomeDouble(); 
double test1 = orig - 1; 
if (orig == test1) 
    SomethingIsWrong(); 
double test2 = test1 + 1; 
if (orig != test2) 
    SomethingIsWrong(); 
1

不能使用双重精确存储东西你问的方式,很少用户可以输入一个数字,一个双能完美表现,但这只会是巧合。如果你需要存储确切的数字,你可以使用一个字符串,只要你不需要做任何操作。如果你需要的不仅仅是这些,那么可能会有这样的精确数学库。