将 double 的小数部分存储为 int

store decimal part of double as int

我目前正在 Swift 2 中为 OS X 申请,其中我有一个名为 x 的双精度变量,我不知道它是什么。我想用这个变量 x 做的是获取十进制值并将其存储为 int。

这就是我想要做的:

var x:Double = some random value
var xdp:Int = decimal part of x

为了更容易理解,假设我的变量 x72.535,我希望变量 xdp535。到目前为止,我已经能够使用此示例 x%1 得到 0.535,然后我可以将其乘以 1000,这将得到 535(这就是我想要的),但是如果该值是 0.53,我最终会得到 530,这是我想要的 10 倍。

如何使用 swift 2 获得 OS X 的十进制值?

对不起,如果这很难理解,我不知道怎么说。如果这很难理解,请告诉我,我会尽力重新措辞。

我会尝试使用像这样的 hack 使用字符串,如果它在您的上下文中是可以接受的:

let x:Double = 72.535
var xdp:Int = 0

if let decimalString = String(x).componentsSeparatedByString(".").last, let decimal = Int(decimalString) {
    xdp = decimal   // 535
}

但这只是一个技巧,所以在使用结果时不要忘记检查错误。

这里棘手的是双精度数不能准确地存储大多数十进制数。您看到的短小数是字符串转换器对显示的数字进行四舍五入的结果。如果您想获得相同的结果,您需要在代码中进行一些舍入。

下面的代码是用 C 编写的(我不知道 swift 但将它翻译成大多数其他语言应该相当容易。在大多数合理的情况下它应该给出你想要的结果。它假设int 是 32 位的。

double d1 = frac(x);
double d2 = (d1 * 10000000000.0);
if (tempd > 2147483647.0) d2 = d1 * 1000000000.0;
int xdp = (int)round(tempd);
while ((xdp > 0) && ((xdp % 10) == 0)) xdp = xdp /10;

你的方法好像没问题

import Darwin

let r0 = 0.750

let f4 = Int(round(r0 % 1 * 4))
print(r0, "is", f4, "quarters")
// 0.75 is 3 quarters

let f1000 = Int(round(r0 % 1 * 1000))
print(r0, "is", f1000, "thousendths")
// 0.75 is 750 thousendths