我具有一个值,该值来自服务器l从1到100,以显示该字段的进度。但是我检查了是否可以为进度条提供从0到1的值。我该如何转换呢?我做了这样的事,但是没用
Int Field = 12;
Decimal d = Field / 100;
Decimal dc = Math.Round(d,1); //to round to one decimal place
return dc;
这将返回0。 我也尝试过:
double d = (double)(Progress / 100);
double dc = Math.Round(d, 1);
return dc;
这也返回0。
答案 0 :(得分:1)
如果要获得最大精度,可以使用以下公式将旧值范围转换为新范围,以保持比率:
var OldRange = (OldMax - OldMin);
var NewRange = (NewMax - NewMin);
//i'm using round here has you requested, but its better to dont use it to achieve best results
var NewValue = Math.Round(((OldValue - OldMin) * NewRange) / OldRange) + NewMin, 1);
以您的情况为例,例如数字12,将为:
var OldRange = 99 //(100 - 1);
var NewRange = 1 //(1 - 0);
var NewValue = Math.Round(((12 - 1) * NewRange) / OldRange) + 0, 1);
得出结论,旧范围内的数字12在新范围内为0.1。
或者如果您不在乎旧范围从1开始,新范围从0开始,则可以将其除以100并取整:
Int field = 12;
Decimal d = field / 100;
Decimal dc = Math.Round(d,1); //to round to one decimal place
return dc;
请注意,在c#中,除法运算符为 / ,而不是%(模数是wich)
答案 1 :(得分:1)
结果是“ /”运算符在C#中不起作用
否,“ /”运算符确实在C#中工作。
由于Field / 100;
为int/int
,结果为0,所以得到零;
Progress / 100
相同,int/int
等于0;
使代码正常工作。您可以将字段定义为Decimal
类型:
Decimal Field = 12;
Decimal d = Field / 100;
Decimal dc = Math.Round(d, 1);
或将100
投射到Decimal
:
int Field = 12;
Decimal d = Field /(Decimal)100;
Decimal dc = Math.Round(d, 1);
您可以在以下两个线程中看到详细的答案:why-does-integer-division-in-c-sharp-return-an-integer-and-not-a-float
和