gpt4 book ai didi

c# - C# 和 Java 之间表达式中 float 或 double 的隐式转换/提升

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:36:14 26 4
gpt4 key购买 nike

如果我有以下表达式:

byte A = 69;
int B = 123;
long C = 3210;
float D = 4.9f;
double E = 11.11;

double X = (B * 100) + 338.1 - (E / B) / C;
double X1 = (B * 100) + (A * D) - (E / B) / C;

// JAVA - lost precision
System.out.println(X); // 12638.099971861307
System.out.println(X1); // 12638.099581236307

// C# - almost the same
Console.WriteLine(X); // 12638.0999718613
Console.WriteLine(X1) // 12638.0999784417

我注意到 Java 失去了 X 的精度,其中 338.1 是隐式 double ,而 C# 几乎没有。我不明白为什么,因为 338.1 在 float 和 double 中是相等的。点后只有一位数字。

最佳答案

在 Java 中,(B * 100) + (A * D) 将是一个 float ;它将是最接近 12638.1 的 float 。但是12638用二进制表示需要14位数字,包括首位1;留下 10 位有效数字来表示小数部分。因此,您将获得最接近 0.1 的 1024 的数量 - 即 102/1024。结果为 0.099609375 - 因此 float 的舍入误差为 0.000390625。

这似乎是您在 Java 程序中获得的 X 和 X1 之间的区别。

恐怕我不是 C# 专家,所以我不能告诉你为什么 C# 不同。

关于c# - C# 和 Java 之间表达式中 float 或 double 的隐式转换/提升,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19423401/

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