Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 转换为十进制和双精度的奇怪舍入_C#_.net_Double_Decimal_Rounding - Fatal编程技术网

C# 转换为十进制和双精度的奇怪舍入

C# 转换为十进制和双精度的奇怪舍入,c#,.net,double,decimal,rounding,C#,.net,Double,Decimal,Rounding,我偶然发现了这个奇怪的行为,我想和大家分享 Convert.ToInt(16,32,64)方法在double或decimal上使用时,请以奇怪的方式键入round: 从msdn: 转换后的值四舍五入为最接近的16位有符号整数。如果 值介于两个整数之间,偶数为 返回;也就是说,4.5转换为4,5.5转换为6 这是一种非常奇怪的行为,它会导致很难找到bug 我使用reflector分析代码,但这是一种extern方法: //Convert.ToInt32 [SecuritySafeCritical,

我偶然发现了这个奇怪的行为,我想和大家分享

Convert.ToInt
(16,32,64)方法在
double
decimal
上使用时,请以奇怪的方式键入round:

从msdn:

转换后的值四舍五入为最接近的16位有符号整数。如果 值介于两个整数之间,偶数为 返回;也就是说,4.5转换为4,5.5转换为6

这是一种非常奇怪的行为,它会导致很难找到bug

我使用reflector分析代码,但这是一种
extern
方法:

//Convert.ToInt32
[SecuritySafeCritical, __DynamicallyInvokable]
public static int ToInt32(decimal value)
{
    return decimal.FCallToInt32(value);
}

//decimal
[MethodImpl(MethodImplOptions.InternalCall), SecurityCritical]
internal static extern int FCallToInt32(decimal d);
我知道,
Convert
类用于将一种基本数据类型转换为另一种基本数据类型,不应将其用于舍入值,但您会同意,我们需要标准舍入


我的问题是,为什么会出现这种行为,以及为什么MSDN上没有用大的红色字体标记它

它被称为银行家舍入,专门用于金融应用。由于
decimal
是为金融应用而设计的,很明显为什么它是
decimal
的默认舍入方法,不是吗?:)

其背后的想法是,如果您总是以一种方式取整,
.5
数字将打破数字的分布,或者换句话说,您的取整错误将显著累积。通过根据均匀度向上或向下取整,在这些情况下,你通常会在50%的时间内取整,而在其余时间内取整-因此误差将趋于非常小


这是在计算机出现之前很久就使用过的东西:)

好吧,但为什么要在双人比赛中复制它……如果不在双人比赛中复制它,那就不一致了。@giammin,这并不重要。几乎不可能将
x.5
作为
双精度
,因为二进制浮点不是十进制精度,只是二进制精度。因此,您可以表示的唯一真实的
.5
数字是
0.5
。实际上,
double
会“自动”完成这类操作,因为您总是会得到像
2.50000001
这样的数字,而这些数字一开始并不是圆点。@Luaan谢谢,今天我学到了一个新东西!)@鲁安,我想我不明白你的评论。1.5, 2.5, 3.5, ... , 4503599627370493.5、4503599627370494.5、4503599627370495.5可以用IEEE 754 64位二进制浮点精确表示。x、 5个数字在实践中显示为一对可精确表示的整数的算术平均值,其中一个是偶数,另一个是奇数。这是银行家舍入,您需要在任何统计应用程序中使用它,否则数字会随着大量数字集向上倾斜。请参阅标题“舍入到最近的整数,或银行家舍入”下的也就是说,框架中某些东西的“为什么”行为方式通常被认为是没有建设性的。ops我发誓我在询问之前搜索了stackoverflow,但没有找到任何东西。对不起,重复了!