Ham*_*med -1 c# floating-point numbers
鉴于X.Y,我想得到X和Y。
例如,鉴于123.456我想得到123和456(NOT 0.456)。
我可以执行以下操作:
decimal num = 123.456M;
decimal integer = Math.Truncate(num);
decimal fractional = num - Math.Truncate(num);
// integer = 123
// fractional = 0.456 but I want 456
Run Code Online (Sandbox Code Playgroud)
如上所述,使用这种方法我会得到0.456,而我需要456. 当然我可以做到以下几点:
int fractionalNums = (int)((num - Math.Truncate(num)) * 1000);
// fracionalNums = 456
Run Code Online (Sandbox Code Playgroud)
此外,此方法需要知道给定的十进制数有多少个小数,以便您可以乘以该数字(例如,123.456有 3、123.4567有 4、123.456789有 6、123.1234567890123456789有 19)。
需要考虑的几点:
出于性能原因,我对基于字符串操作的方法不感兴趣。
我的问题中的数字是decimal类型的,因此仅适用于decimal类型并且失败float或double(由于浮点精度)的方法是可以接受的。
小数的两侧(即整数部分和小数部分)可以认为是两个整数。因此,123.000456不是预期的输入;并且即使给出,也可以将其拆分为123and 456(因为两边都被认为是整数)。
BitConverter.GetBytes(decimal.GetBits(num)[3])[2]; - 逗号后的位数
long[] tens = new long[] {1, 10, 100, 1000, ...};
decimal num = 123.456M;
int iPart = (int)num;
decimal dPart = num - iPart;
int count = BitConverter.GetBytes(decimal.GetBits(num)[3])[2];
long pow = tens[count];
Console.WriteLine(iPart);
Console.WriteLine((long)(dPart * pow));
Run Code Online (Sandbox Code Playgroud)