C# c语言中的双转换值错误#
手动计算时的原始值,rad为1.5707963267948966,但调试时rad为1.5707963705062866时显示,这是什么原因以及如何修复。但正确答案仅为手动计算答案 以下是便于比较的数字:C# c语言中的双转换值错误#,c#,double,C#,Double,手动计算时的原始值,rad为1.5707963267948966,但调试时rad为1.5707963705062866时显示,这是什么原因以及如何修复。但正确答案仅为手动计算答案 以下是便于比较的数字: double deg=90; double two= 2* System.Math.PI; double rad=(two)*(deg/360); 1.570796363267948966 1.5707963705062866 ---------发生舍入误差;这不是无限精确。您必须测试值是否适
double deg=90;
double two= 2* System.Math.PI;
double rad=(two)*(deg/360);
1.570796363267948966
1.5707963705062866
---------发生舍入误差;这不是无限精确。您必须测试值是否适当接近-不要只测试是否相等。在某些情况下,通过在不同的序列中应用运算符,您可能也会看到细微的差异,因此您不会用大小来淹没小数字。使用十进制类型而不是双精度类型。这是由于浮点精度。您应该使用十进制
值,它比双精度双精度更精确,浮点和十进制实际上是您唯一的标准选项。如果它们的精度不足以满足您的需要,则需要创建自己的类型,并为其提供一种存储这些高精度值的方法以及用于执行数学函数的自己的运算符
您会注意到双精度类型精确到7位,十进制类型精确到稍高一点。如果你想获得更高的精度,你需要想出一个算法来计算和存储它。使用你的代码,我无法重现你所看到的
我这样做:
使用制度
1.5707963267948966
1.5707963705062866
--------- <-- differences
我得到了这个输出:
namespace ConsoleApplication18
{
class Program
{
static void Main(string[] args)
{
double deg = 90;
double two = 2 * System.Math.PI;
double rad = (two) * (deg / 360);
Console.Out.WriteLine(rad);
}
}
}
当鼠标悬停在WriteLine行的断点上的rad
变量上时,我在工具提示中看到了以下值
1.5707963267949
您在哪里/如何看到其他价值
上面的差异可能是因为我没有在写调用中指定精度,所以可能我也可以得到那里的所有数字。我当然看不到你提到的第二个值。这里是对浮点运算的一个很好的描述:
我需要精确的数值来进行进一步的计算,所以你只需要涉及Pi的数学的精确数值?我希望你有足够的公羊。。。您需要使用专门的库来实现这一点double
(IEEE 754)根本做不到。@Residuum:Pi是一个数字,据人类所知,小数点后有无限多个位数。@Marc,非理性的证明非常简单,这里有一个很好的例子:。证明圆周率不仅是非理性的,而且是先验的,这一点更为棘手;首先证明e是超越的,然后π的结果来自于Euler的恒等式。@Eric Lippert:或者Lindemann Weierstrass定理让你同时得到e
和π
。十进制也是唯一的近似值。。。但是它是以不同的方式进行近似的(并且还有更多的比特可以使用)。它的速度也明显较慢。十进制类型应该用于货币计算之类的事情。在进行科学/数学计算时,应使用Double,除非您需要更高的精度,否则最好使用专门的库。您能否发布一个简短但完整的程序来展示问题?我无法复制它。当你说“手动计算”时,你的意思是你在用某种计算器做这件事吗?正如其他人所指出的,π有一个无限的十进制展开式,所以你在问题中给出的任何“精确”答案都已经是一个近似值。差值是亿分之一。您可能正在执行哪些工程应用程序,需要精确到1亿分之一的精度?我是在windows窗体应用程序中执行的。您是否可以创建一个简短但完整的程序来向我们显示问题?由于我无法重构问题,我敢打赌,所讨论的代码并不像您在问题中提出的代码那么简单。换言之,我敢打赌有些事你没有告诉我们。我的猜测是,您已经落入了“简化”代码的正常陷阱,以便我们能够理解它,并且在这个过程中,您已经“简化”了问题。双精度类型不能精确到只有7个位置,更像是16个位置。问题中的问题不是因为使用了不精确的双数据类型。你注意到的是,他的问题似乎表明精度只有7位,但这是错误的。我知道,但在他的例子中,由于圆周率和运算顺序的不同,他的计算只精确到7位。我想说的是,标准类型应该足够好,可以完成任务,如果它们不是新类型,那么只需要对它们进行修改以实现结果。
1.5707963267948966