返回小数的整数部分(在c#中)的最佳方法是什么?(这必须适用于可能不适合 int 的非常大的数字)。
GetIntPart(343564564.4342) >> 343564564
GetIntPart(-323489.32) >> -323489
GetIntPart(324) >> 324
这样做的目的是:我正在插入数据库中的十进制 (30,4) 字段,并希望确保我不会尝试插入一个对于该字段来说太长的数字。确定小数的整数部分的长度是此操作的一部分。
顺便说一句, (int)Decimal.MaxValue 会溢出。您无法获得小数的“int”部分,因为小数太大而无法放入 int 框中。刚刚检查过......它甚至太大了(Int64)。
如果您希望 Decimal 值的位位于点的左侧,则需要执行以下操作:
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
我希望能帮助你。
/// <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