鉴于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
但是,如上所述,使用这种方法我会得到0.456
,而我需要456
. 当然我可以做到以下几点:
int fractionalNums = (int)((num - Math.Truncate(num)) * 1000);
// fracionalNums = 456
但是,此方法需要知道给定的十进制数有多少个小数,以便您可以乘以该数字(例如,123.456
有 3、123.4567
有 4、123.456789
有 6、123.1234567890123456789
有 19)。
需要考虑的几点:
出于性能原因,我对任何基于字符串操作的方法都不感兴趣;请不要推荐这样的方法。
我的问题中的数字是decimal
类型的,并且仅适用于decimal
类型并且失败float
或double
(由于浮点精度)的方法是可以接受的。
小数的两侧(即整数部分和小数部分)可以认为是两个整数。因此,123.000456
永远不会给挑战,即使给定,也可以将其拆分为123
和456
(因为双方都被视为整数)。
Decimal 有 96 位尾数,因此long不足以获得所有可能的值。
定义为Decimal定义的 10 的所有(正)幂:
decimal mults[] = {1M, 1e1M, 1e2M, 1e3M, <insert rest here>, 1e27M, 1e28M};
然后,在循环内部,您需要获得比例(“尾数”除以得到小数标称值的10 的幂):
int[] bits = Decimal.GetBits(n);
int scale = (bits[3] >> 16) & 31; // 567.1234 represented as 5671234 x 10^-4
decimal intPart = (int)n; // 567.1234 --> 567
decimal decPart = (n - intPart) * mults[scale]; // 567.1234 --> 0.1234 --> 1234
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句