我决定重新创建我的问题:
decimal dTotal = 0m;
foreach (DictionaryEntry item in _totals)
{
if (!string.IsNullOrEmpty(item.Value.ToString()))
{
dTotal += Convert.ToDecimal(item.Value);
}
}
Console.WriteLine(dTotal / 3600m);
Console.WriteLine(decimal.Round(dTotal / 3600m, 2));
Console.WriteLine(decimal.Divide(dTotal, 3600m));
Run Code Online (Sandbox Code Playgroud)
上面的代码返回:
579.99722222222222222222222222
580.00
579.99722222222222222222222222
所以,这就是我的问题来自哪里,我真的需要它来展示579.99
; 但任何一轮,无论是decimal.Round
或Math.Round
仍然回归580
; 甚至是{0:F}
返回的字符串格式580.00
.
我怎么能正确地做到这一点?
Jon*_*eet 10
新答案(新问题)
好的,所以你有一个值579.99722222222222222222222222
- 并且你要求将其四舍五入到小数点后两位.不是580.00的自然答案吗?它比579.99更接近原始值.听起来你本质上想要地板行为,但是有一定数量的数字.为此,您可以使用:
var floored = Math.Floor(original * 100) / 100;
Run Code Online (Sandbox Code Playgroud)
在这种情况下,您可以一步完成两个步骤:
var hours = Math.Floor(dTotal / 36) / 100;
Run Code Online (Sandbox Code Playgroud)
......相当于
var hours = Math.Floor((dTotal / 3600) * 100) / 100;
Run Code Online (Sandbox Code Playgroud)
原始答案(原始问题)
听起来你可能有payTotal
一个不恰当的形式开始:
using System;
class Test
{
static void Main()
{
decimal pay = 2087975.7m;
decimal time = pay / 3600;
Console.WriteLine(time); // Prints 579.99325
}
}
Run Code Online (Sandbox Code Playgroud)
这就是问题:
var payTotal = 2087975.7;
Run Code Online (Sandbox Code Playgroud)
那是分配payTotal
给double
变量的.你实际获得的价值是2087975.69999999995343387126922607421875,这不是你想要的.你发现自己从铸造任何时间double
到decimal
,反之亦然,你应该担心:机会是你在什么地方使用了错误的类型.货币值应该绝对存储decimal
而不是double
(并且有各种其他Stack Overflow问题讨论何时使用哪个).
有关更多信息,请参阅我关于浮点的两篇文章:
(一旦你得到了正确的结果,格式化它们当然是另一回事,但这不应该太糟糕......)