【问题标题】:store decimal part of double as int将 double 的小数部分存储为 int
【发布时间】:2015-10-28 19:39:08
【问题描述】:

我目前正在为 OS X 的 Swift 2 创建一个应用程序,其中我有一个名为 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 for OS X 获取十进制值?

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

【问题讨论】:

  • 为什么你认为 530 是 10 倍?如果 535 表示千分之 535,则 530 表示千分之 530,所以它是正确的,不是吗?

标签: int double swift2


【解决方案1】:

如果在您的上下文中可以接受,我会尝试使用这样的 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,则很有可能它起作用了。你认为这样可以进行错误检查吗?
  • 进行扩展是个好主意。至于错误处理,这取决于您的其余代码的组织方式。如果这个系统适合,那就没问题了。您也可以将xdp 设为可选。还有很多其他的可能性......
【解决方案2】:

你的方法似乎没问题

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-23
      • 1970-01-01
      • 2013-01-06
      • 1970-01-01
      • 2011-06-20
      • 1970-01-01
      • 2021-08-01
      • 1970-01-01
      相关资源
      最近更新 更多