使用十进制显示的十进制值不正确.分析



我在vb:中有这段代码

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

这里,StartTimeEndTimeDate,值是上午09:30和下午06:30。这给了我值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格式吗?

正如您在评论中所说,您遇到的问题是整数除法。这是一个整数除以一个整数,结果总是一个整数。这就是c#中的工作方式。要将double作为最终值,其中一个操作数必须是double。在这种情况下,您可以通过指定/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的总分钟数的两倍,在这种情况下返回540,因为我们的Timespan表示9小时或540分钟。

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

最新更新