Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/324.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# 使用Decimal.Parse时,十进制值显示不正确_C# - Fatal编程技术网

C# 使用Decimal.Parse时,十进制值显示不正确

C# 使用Decimal.Parse时,十进制值显示不正确,c#,C#,我在vb中有以下代码: dim d As Object d = CDec((DateDiff("n", Format(StartTime), "hh:mm tt"), Format(EndTime), "hh:mm tt")) + 1) / 60) 这里,StartTime和EndTime是Date,值是上午09:30和下午06:30。这给了我9.016667的值 当我用C#转换这个时: 这里,StartTime和EndTime是DateTime,值是09:30和18:30。这给了我9的值。

我在vb中有以下代码:

dim d As Object
d = CDec((DateDiff("n", Format(StartTime), "hh:mm tt"), Format(EndTime), "hh:mm tt")) + 1) / 60)
这里,
StartTime
EndTime
Date
,值是上午09:30和下午06:30。这给了我9.016667的值

当我用C#转换这个时:

这里,
StartTime
EndTime
DateTime
,值是09:30和18:30。这给了我9的值。
我没有得到十进制值。我有什么遗漏吗?是因为
EndTime
是24小时
DateTime
格式吗?

您遇到的问题是整数除法,正如您在评论中所说的那样。也就是说,一个整数除以一个整数将始终得到一个整数作为结果。这就是c#的工作原理。要将double作为最终值,其中一个操作数必须是double。在这种情况下,您可以通过指定
/60.0
来实现这一点

但是,如果转换为c#,您最好使用比直接翻译更好的代码。这里有一些代码也是这样做的(前两行将在您的代码中省略,因为您已经有了日期对象)

输出:

9.016667

并将其分解:

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

.TotalMinutes
-
Timespan
有一个属性,该属性是一个双精度的值,表示该
Timespan
的总分钟数,在本例中返回540,因为我们的
Timespan
表示9小时或540分钟


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

您遇到的问题是整数除法,正如在注释中所述。也就是说,一个整数除以一个整数将始终得到一个整数作为结果。这就是c#的工作原理。要将double作为最终值,其中一个操作数必须是double。在这种情况下,您可以通过指定
/60.0
来实现这一点

但是,如果转换为c#,您最好使用比直接翻译更好的代码。这里有一些代码也是这样做的(前两行将在您的代码中省略,因为您已经有了日期对象)

输出:

9.016667

并将其分解:

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

.TotalMinutes
-
Timespan
有一个属性,该属性是一个双精度的值,表示该
Timespan
的总分钟数,在本例中返回540,因为我们的
Timespan
表示9小时或540分钟


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

objectd为什么?使用
var
Try
/60.0
,DateDiff返回一个'long',这意味着如果时间精确到09:30和18:30,整数除法(DIV)可能重复的结果不是9正确的吗?无论如何,要执行正确的除法结果,必须将60指定为十进制,可以使用文字后缀M,例如
(DateAndTime.DateDiff(“n”,StartTime.ToString(“hh:mm tt”),EndTime.ToString(“hh:mm tt”))+1)/60M
@DarjanBogdan:No。时间间隔为9*60分钟。如果你加1除以60,你得到9+1/60。为什么OP要添加1我不能说,但它们是。:)<代码>对象d为什么?使用
var
Try
/60.0
,DateDiff返回一个'long',这意味着如果时间精确到09:30和18:30,整数除法(DIV)可能重复的结果不是9正确的吗?无论如何,要执行正确的除法结果,必须将60指定为十进制,可以使用文字后缀M,例如
(DateAndTime.DateDiff(“n”,StartTime.ToString(“hh:mm tt”),EndTime.ToString(“hh:mm tt”))+1)/60M
@DarjanBogdan:No。时间间隔为9*60分钟。如果你加1除以60,你得到9+1/60。为什么OP要添加1我不能说,但它们是。:)
object d;
d = decimal.Parse(((DateAndTime.DateDiff("n", StartTime.ToString("hh:mm tt"), EndTime.ToString("hh:mm tt")) + 1) / 60).ToString());
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);