Java和;C#

Java和;C#,java,c#,double,precision,Java,C#,Double,Precision,我在Java&C中运行了相同的代码,它给出了两个不同的结果 为什么??由于两种语言中的双精度符号具有完全相同的含义: double是表示64位浮点数的类型 在爪哇 double是一种表示64位双精度数字的类型 格式为C# JAVA C# 其根源是浮点数不精确,计算甚至不能真正依赖于确定性。但他们很接近 最有可能的区别可能是因为CLR允许在内部使用双倍于80位的数字。您从未看到超过64位的数据,但是处理器将使用80位。我不确定Java如何在内部处理浮点数。可能是一样的 关于这个主题有很多,但这

我在Java&C中运行了相同的代码,它给出了两个不同的结果

为什么??由于两种语言中的双精度符号具有完全相同的含义:

double是表示64位浮点数的类型 在爪哇

double是一种表示64位双精度数字的类型 格式为C#


JAVA
C#
其根源是浮点数不精确,计算甚至不能真正依赖于确定性。但他们很接近

最有可能的区别可能是因为CLR允许在内部使用双倍于80位的数字。您从未看到超过64位的数据,但是处理器将使用80位。我不确定Java如何在内部处理浮点数。可能是一样的


关于这个主题有很多,但这里有一些随机的,可能是有趣的。

这只是C#在
writeLine
方法中使用的精度。请参见其中指定G格式说明符提供15位精度的地方

如果你写:

Console.WriteLine(a.ToString("R"));

它打印
0.019914856674816989

IEEE754在所需操作和可选操作之间有区别:

  • ,如加法、减法等必须精确四舍五入
  • 不需要精确四舍五入,并且这些操作的列表包括所有三角函数(和其他函数),它们将被用于实现
因此,您无法从标准中保证
sin
cos
实现之间应该匹配


更多信息或。

我怀疑这更多是由于控制台输出将数字四舍五入,而不是基本的数学运算。你确定
Sin
Cos
的实现是相同的吗?@realpoint一点也不确定。保罗:是的,这也是老师告诉我的,但我想有一个适当的解释。@realponsignist它似乎来自Java中的本地方法。我认为在C#中也是如此,因此我找不到确切的实现。
double a = Math.Pow(Math.Sin(3), 2);
double b = Math.Pow(Math.Cos(3), 2);
Console.WriteLine(a);   // 0.019914856674817
Console.WriteLine(b);   // 0.980085143325183
Console.WriteLine(a+b); // 1
Console.WriteLine(a.ToString("R"));