查看Convert.ToInt32()它的msdn文档说明:
如果值在两个整数之间,则返回偶数; 也就是说,4.5转换为4,5.5转换为6.
http://msdn.microsoft.com/en-us/library/ffdk7eyz.aspx
为什么是这样?
当然,舍入到最接近的整数更合乎逻辑,不是吗?如果是这样,4.5将变为5,而5.5将变为6,这似乎更直观.
我在VB.Net中的Math.Round函数中有一个如此奇怪的情况
Math.Round((32.625), 2)
Run Code Online (Sandbox Code Playgroud)
结果:32.62
Math.Round((32.635), 2)
Run Code Online (Sandbox Code Playgroud)
结果:32.64
我需要32.63,但在这些情况下,该功能在不同的逻辑中工作.
我可以得到小数部分并做出我想做的事情.但是这不是太奇怪了,一个是向上走向更高,一个是向下走向更低.
那么如何从32.625获得32.63而不会弄乱小数部分呢?(作为数学的自然逻辑)
在C#里还有两位小数四舍五入策略的准确性任何差异MidpointRounding.ToEven和MidpointRounding.AwayFromZero?我的意思是两者都确保在四舍五入的数字中均匀分布,或者是一个舍入策略而不是表示与另一个相比的舍入数字?
string[] strArray = new string[10] { "21.65", "30.90", "20.42", "10.00", "14.87", "72.19", "36.00", "45.11", "18.66", "22.22" };
float temp = 0.0f;
Int32 resConvert = 0;
Int32 resCast = 0;
for (int i = 0; i < strArray.Length; i++)
{
float.TryParse(strArray[i], out temp);
resConvert = Convert.ToInt32(temp * 100);
resCast = (Int32)(temp * 100);
Console.WriteLine("Convert: " + resConvert + " ExplCast: " + resCast);
}
Run Code Online (Sandbox Code Playgroud)
答案:
Convert: 2165 ExplCast: 2164 // ??
Convert: 3090 ExplCast: 3089 // ??
Convert: 2042 ExplCast: 2042 …Run Code Online (Sandbox Code Playgroud) 我正在构建一个与paypal集成的电子商务网站.
我们采取多种货币,所以我想确保(出于会计原因)我正确地执行货币转换的任何数学.
在将货币转换*乘以原始货币之后,我总是在小数点后面有大量的尾随数字.
有没有标准的方法来做到这一点?我应该截断还是圆?如果舍入1/1000小数将影响舍入1/100十进制,我是否需要多次舍入?
我应该做的事情如下:
Math.Round(Math.Round(x, 3), 2)
Run Code Online (Sandbox Code Playgroud)
我一直无法找到关于如何做到的好信息(希望美国和欧洲是一样的).
通过银行家的舍入我的意思是
按照IEEE 754的建议:
舍入到最接近的值; 如果数字中间下降,则使用偶数(零)最低有效位舍入到最接近的值.这是二进制浮点的默认值,也是十进制的推荐默认值.
据说该方法优于
理由是它"在对四舍五入的数字求和时最小化预期误差".显然,这是因为 "它不会受到负面或正偏差的影响,就像在大多数合理分布上从零方法的一半那样".
我不明白为什么会这样.直观地,如果0.0向零舍入,则0.5"应该"从零舍入(如方法2中所示).这样,相同数量的数字将朝向零并且远离零.换句话说,如果浮动数字用1个十进制数字表示,十个数字中的数字0.0,......,0.9五个将向下舍入,五个用方法2进行四舍五入.类似地1.0,... 1.9等等.
当然,浮点数用二进制尾数表示,但我认为上述推理仍然适用.请注意,对于IEEE 754双精度,整数和整数加半精度可以精确表示绝对值到2^52大约,因此这些精确值实际上会显示出来.
那么方法1如何更好?
在SQL Server Reporting Services中生成的报告中发生了一些奇怪的事情,我希望我不会太愚蠢.我使用Round函数来获取整数.有时4.5会舍入到4而5.5会舍入到6.这是因为舍入方法吗?我用这个:
Round(Fields!GroupAverageAssessment.Value,0)
Run Code Online (Sandbox Code Playgroud)
如何定期舍入(4.5到5,3.5到4,6.5到7等等......)
谢谢
为什么Math.Round(0.125,2)舍入到0.12?
Dim foo As Decimal
foo = Math.Round(0.125, 2)
Run Code Online (Sandbox Code Playgroud)
foo现在是0.12但它应该是0.13
我听说这是因为.Net中的某些标准是最接近的偶数,但这只是糟糕的数学.12.5将向下舍入到12,但13.5将向上舍入到14.有没有办法解决这个问题?
可能重复:
.Net Round Bug
在C#中:Math.Round(2.5)结果是2(而不是3)!你在跟我开玩笑吗?
码:
var d1 = Math.Round(187.5); // 188
var d2 = Math.Round(62.5); // 62
Run Code Online (Sandbox Code Playgroud)
为什么会这样?