将双精度浮点数的小数部分存储为整数

3

我正在使用Swift 2为OS X制作一个应用程序,其中有一个名为x的变量,类型为double,我不知道它是什么。我想做的是将这个变量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上获取小数值?
对不起,如果难以理解,请告诉我,我会尽力重新表述。

你为什么认为530是10倍大?如果535表示535千分之一,那么530就表示530千分之一,所以这是正确的,不是吗? - user3441734
3个回答

2
我会尝试使用String这样的“hack”来解决问题,如果在您的情境中可行的话。
let x:Double = 72.535
var xdp:Int = 0

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

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


我所做的是将其转换为扩展。如果可能,我会返回十进制值,否则返回-1,仅因为我很少或从未得到该值。这样,如果数字大于或等于0,那么它有很强的可能性已经起作用了。你认为这对于错误检查可以吗? - iProgram
1
制作一个扩展是个好主意。至于错误处理,这取决于你的代码如何组织。如果这个系统适合,那就没问题了。你也可以将xdp设置为可选项。还有很多其他可能性... - Eric Aya

0

这里的棘手之处在于双精度浮点数无法准确存储大多数小数。您看到的短小数是字符串转换器为显示而四舍五入的结果。如果您想获得相同的结果,您需要在代码中进行一些舍入。

下面的代码是用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;

0

你的方法看起来是可以的

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接