使用十进制。十进制值显示不正确

时间:2019-01-11 10:22:57

标签: c#

我在vb中有以下代码:

dim d As Object
d = CDec((DateDiff("n", Format(StartTime), "hh:mm tt"), Format(EndTime), "hh:mm tt")) + 1) / 60)

此处,StartTimeEndTimeDate,值是09:30 AM和06:30 PM。这给我值9.01666666666667

当我在C#中将其转换时:

object d;
d = decimal.Parse(((DateAndTime.DateDiff("n", StartTime.ToString("hh:mm tt"), EndTime.ToString("hh:mm tt")) + 1) / 60).ToString());

此处,StartTimeEndTimeDateTime,值是09:30和18:30。这给我价值9。 我没有十进制值。我有什么想念的吗?是因为EndTime是24小时DateTime格式吗?

1 个答案:

答案 0 :(得分:3)

您遇到的问题是整数除法,正如您在评论中所告诉的那样。也就是说,将整数除以整数将始终得出整数。这就是C#中的工作方式。要使双精度数作为最终值,操作数之一必须是双精度数。在这种情况下,您可以通过指定/60.0来做到这一点。

但是,如果转换为c#,则最好使用比直接翻译更好的代码。这是一些执行相同操作的代码(由于您已有Date对象,因此前两行将在您的代码中省略)。

var startTime = new DateTime(2019,1,11,9,30,0);
var endTime = new DateTime(2019,1,11,18,30,0);

var d = ((endTime-startTime).TotalMinutes+1)/60;
Console.WriteLine(d);

输出:

  

9.01666666666667

并将其分解:

endTime-startTime-在c#中,您可以从另一个对象中减去一个DateTime对象,并获得一个TimeSpan对象。

.TotalMinutes-Timespan具有TotalMinutes属性,该属性是一个双精度值,代表该Timespan的分钟总数-在这种情况下,自我们的{ {1}}代表9个小时或540分钟。

加法和减法非常简单。不过要注意的是,该除法现在是一个双精度整数除以整数,因此结果将是一个双精度整数,因此不会像原始代码那样丢失小数部分。