返回小数的整数部分(在C#中)的最佳方法是什么?(这必须适用于可能不适合int的非常大的数字)。
GetIntPart(343564564.4342) >> 343564564
GetIntPart(-323489.32) >> -323489
GetIntPart(324) >> 324
这样做的目的是:我要在db中插入一个十进制(30,4)字段,并且要确保我不尝试插入一个数字,该数字对于该字段来说太长了。确定小数部分整数的长度是此操作的一部分。
返回小数的整数部分(在C#中)的最佳方法是什么?(这必须适用于可能不适合int的非常大的数字)。
GetIntPart(343564564.4342) >> 343564564
GetIntPart(-323489.32) >> -323489
GetIntPart(324) >> 324
这样做的目的是:我要在db中插入一个十进制(30,4)字段,并且要确保我不尝试插入一个数字,该数字对于该字段来说太长了。确定小数部分整数的长度是此操作的一部分。
Answers:
伙计们,(int)Decimal.MaxValue将溢出。您无法获得小数点的“ int”部分,因为小数点太小而无法放入int框中。刚刚检查过...它甚至太大了(Int64)。
如果要将十进制值的位设置为点的左移,则需要执行以下操作:
Math.Truncate(number)
并将值返回为... DECIMAL或DOUBLE。
编辑:截断绝对是正确的功能!
我认为System.Math.Truncate是您要找的东西。
取决于您在做什么。
例如:
//bankers' rounding - midpoint goes to nearest even
GetIntPart(2.5) >> 2
GetIntPart(5.5) >> 6
GetIntPart(-6.5) >> -6
要么
//arithmetic rounding - midpoint goes away from zero
GetIntPart(2.5) >> 3
GetIntPart(5.5) >> 6
GetIntPart(-6.5) >> -7
默认值始终是前者,这可能会让人感到惊讶,但很有意义。
您的显式转换将执行以下操作:
int intPart = (int)343564564.5
// intPart will be 343564564
int intPart = (int)343564565.5
// intPart will be 343564566
从您说出问题的方式来看,听起来这不是您想要的-您每次都想放下它。
我会做:
Math.Floor(Math.Abs(number));
还要检查您的大小decimal
-它们可能很大,因此您可能需要使用long
。
您只需要强制转换,如下所示:
int intPart = (int)343564564.4342
如果仍要在以后的计算中将其用作小数,则需要使用Math.Truncate(如果希望对负数有某种行为,则可以使用Math.Floor)。
分离值及其分数部分值的非常简单的方法。
double d = 3.5;
int i = (int)d;
string s = d.ToString();
s = s.Replace(i + ".", "");
s是小数部分= 5,
i是整数= 3的值
(int)Decimal.MaxValue
会溢出。
希望对您有帮助。
/// <summary>
/// Get the integer part of any decimal number passed trough a string
/// </summary>
/// <param name="decimalNumber">String passed</param>
/// <returns>teh integer part , 0 in case of error</returns>
private int GetIntPart(String decimalNumber)
{
if(!Decimal.TryParse(decimalNumber, NumberStyles.Any , new CultureInfo("en-US"), out decimal dn))
{
MessageBox.Show("String " + decimalNumber + " is not in corret format", "GetIntPart", MessageBoxButtons.OK, MessageBoxIcon.Error);
return default(int);
}
return Convert.ToInt32(Decimal.Truncate(dn));
}
Public Function getWholeNumber(number As Decimal) As Integer
Dim round = Math.Round(number, 0)
If round > number Then
Return round - 1
Else
Return round
End If
End Function
decimal
远大于的范围int
。另外,这不是VB问题。