我们只想将用户输入的值自动舍入到最接近的.25小时间隔。因此,用户可以输入1.55,并在保存到数据库时舍入到1.50。如果用户输入1.90将2.00保存到数据库。
答案 0 :(得分:7)
您可以Math.Round
使用MidpointRounding.AwayFromZero
;
double d = 1.55 * 4;
double i = Math.Round(d, MidpointRounding.AwayFromZero);
Console.WriteLine(i / 4);
输出
1.5
这里有 demonstration
。
作为一种解释,乘以4然后舍入可以为您提供4位小数部分,例如.00
,.25
,.50
,.75
。
将此双倍除以4
,可以提供最接近.25
小时的间隔。
这里有完整的示例代码;
double[] array = new[] { 1.0, 1.1, 1.2, 1.25, 1.3, 1.4, 1.5, 1.55, 1.6, 1.7, 1.75, 1.8, 1.9 };
foreach (double item in array)
{
double d = item * 4;
double i = Math.Round(d, MidpointRounding.AwayFromZero);
Console.WriteLine(i / 4);
}
输出将是;
1.0 gives you 1.0
1.1 gives you 1.0
1.2 gives you 1.25
1.25 gives you 1.25
1.3 gives you 1.25
1.4 gives you 1.5
1.5 gives you 1.5
1.55 gives you 1.5
1.6 gives you 1.5
1.7 gives you 1.75
1.75 gives you 1.75
1.8 gives you 1.75
1.9 gives you 2.0
这里有 full demonstration
。
答案 1 :(得分:2)
这样的事情应该这样做:
double value = 1.55;
double roundedValue = Math.Round(value/.25)*.25;
答案 2 :(得分:2)
0.25
是1/4,所以你可以通过
double rounded = round(4.0 * hoursEntered) / 4.0
round
不存在。您必须使用适当的舍入功能和选项。对于aspx.cs(C#代码隐藏),请参阅System.Math.Round
。
此外,要将其链接到网页上的文本框,您需要一些规则/验证器或textchange处理程序或典型文本解析的任何位置。您也可以尝试在JavaScript客户端执行此操作,* 4/4技巧保持不变,只需round
函数将具有不同的名称。
答案 3 :(得分:0)
您可以使用ToInt32()
转换功能,如下所示:
double x = input_value;
x = x * 4;
int y = Toint32(x);
x = ((double) y) / 4;
我认为这样可行。我看到还有其他更优雅的解决方案。
答案 4 :(得分:-2)
多次调用Math.Round方法。由于.NET Framework区分十进制类型和双精度类型,因此会自动选择最佳重载。您可以使用一到三个参数调用Math.Round。 阅读this article