C# 求整数等分双精度的正确方法

C# 求整数等分双精度的正确方法,c#,.net,C#,.net,我需要得到double的分数部分,比如int和两个数字。我的代码 (int)Math.Floor(val * 100 - (int)val * 100) 但此can(int)val*100可能超出int或long的范围。好啊 如果我尝试 (int)Math.Floor((val - (int)val) * 100) 返回值可能不正确。例如: double val = 56.9; int retVal = (int)Math.Floor((val - (int)val) * 100); //

我需要得到double的分数部分,比如int和两个数字。我的代码

(int)Math.Floor(val * 100 - (int)val * 100)
但此can
(int)val*100
可能超出int或long的范围。好啊 如果我尝试

(int)Math.Floor((val - (int)val) * 100)
返回值可能不正确。例如:

double val = 56.9;
int retVal = (int)Math.Floor((val - (int)val) * 100);
// retVal = 89, because (val - (int)val) return 0.899999999675
如何正确获取double like int的小数部分?

试试这个

double val = 56.9;
double result=0;
int retVal = (int)Math.Floor((val - (int)val) * 100);
// retVal = 89, because (val - (int)val) return 0.899999999675
int FrctPart=result.ToString().Split('.')[1]
也许像这样

decimal d = (decimal)val;
int retVal = Math.Floor((d - Math.Floor(d)) * 100);
// 59.9 --> 90
// 123.456 --> 45

尝试以下方法:

public static int GetFrac2Digits(this double d)
{
    var str = d.ToString("0.00", CultureInfo.InvariantCulture);
    return int.Parse(str.Substring(str.IndexOf('.') + 1));
}
您还可以使用而不是强制转换到
int

double val = 56.9;
int retVal = (int)Math.Round((val-Math.Truncate(val)) * 100);
// retVal is now 90

表示您希望
899999975
作为整数??可能的重复项以避免舍入错误。如果可能,您应该使用
decimal
。@Аааа检查我的答案。我希望它能有所帮助。可能重复的
Math.Round()
函数可能会改变数字。我认为这不是更好的解决办法。