gpt4 book ai didi

java - StreamTokenizer 输入数字和解析数字不同

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:22:37 25 4
gpt4 key购买 nike

我有一个接受数字的 StreamTokenizer。但是,解析的数字与输入的数字不同。

示例代码:

String str = "1000000000000.0000000000000";
double initial = 1000000000000.0000000000000;
InputStream in = new ByteArrayInputStream(str.getBytes());
StreamTokenizer input = new StreamTokenizer(new BufferedReader(new InputStreamReader(in)));
input.parseNumbers();
int n = input.nextToken();
if (n == StreamTokenizer.TT_NUMBER) {
System.out.println("Original: " + str);
System.out.println("Parsed: " + input.nval);
System.out.println(initial + " == " + input.nval + " -> " + (initial == input.nval));
}

输出:

Original: 1000000000000.0000000000000
Parsed: 9.999999999999999E11
1.0E12 == 9.999999999999999E11 -> false

如何防止这两个 double 值相等?

编辑:链接的问题讨论了为什么会出现此问题。我在问有什么可能的方法可以避免这个问题。

最佳答案

表示数字的一种准确方法是使用 BigDecimal。 double 具有一定的精度,使用各种精度的 double (例如:double1=10000.0 和 double2=0.0001)可能会导致 0.0001 被丢弃。 BigDecimal 避免了这种情况。

BigDecimal 的缺点:

  • 比较慢
  • 运算符 +、-、* 和/没有重载

但是如果你在处理金钱或者必须要有精度,你应该使用 BigDecimal,否则你就会有损失。例如:

String str = "1.0E12";
double initial = 1000000000000.0000000000000;
BigDecimal exVal = new BigDecimal(str);
System.out.println("Original: " + str);
System.out.println("Parsed: " + exVal);
System.out.println(initial + " == " + exVal + " -> " + (initial == exVal.doubleValue()));

程序输出:

Original: 1.0E12
Parsed: 1.0E+12
1.0E12 == 1.0E+12 -> true

关于java - StreamTokenizer 输入数字和解析数字不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51852414/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com