斯威夫特得到漂浮的分数

时间:2014-07-28 14:01:52

标签: objective-c math swift type-conversion

我最近一直在努力尝试,而且我遇到了一个相当简单的问题。

在Obj-C中,当我想得到一个浮点数的小数位时,请执行以下操作:

float x = 3.141516
int integer_x = (int)x;
float fractional_x = x-integer_x;
//Result: fractional_x = 0.141516
在Swift中

let x:Float = 3.141516
let integerX:Int = Int(x)
let fractionalX:Float =  x - integerX 

- >由于错误匹配类型

,这会导致错误

任何想法如何正确地做到这一点?

先谢谢

马尔特

5 个答案:

答案 0 :(得分:13)

使用modf功能:

let v = 3.141516
var integer = 0.0
let fraction = modf(v, &integer)
println("fraction: \(fraction)");

输出:

  

分数:0.141516

对于float而不是double,只需使用:modff

答案 1 :(得分:7)

使用替换模数运算符的.truncatingRemainder(dividingBy:) x%1 ),其中(对于模数)

    立即
  • (只有一个字符),
  • 几个cpu周期(大概只有一个周期,因为modulo是一个常见的cpu指令)

给出小数部分。

let x:Float = 3.141516
let fracPart =  x.truncatingRemainder(dividingBy: 1) // fracPart is now 0.141516

fracPart将采用以下值: 0.141516 。这适用于doublefloat

答案 2 :(得分:3)

问题是你不能减去Float和Int,你应该把这个值中的一个转换为另一个,试试这个:

let fractionalX:Float = x - Float(integerX)

答案 3 :(得分:3)

Swift 3不喜欢模数运算符%。它希望我使用truncatingRemainder类型的Double

let x1:Double = 123.00
let t1 = x1.truncatingRemainder(dividingBy: 1)
print("t1 = \(t1)")
let x2:Double = 123.45
let t2 = x2.truncatingRemainder(dividingBy: 1)
print("t2 = \(t2)")

产生输出:

t1 = 0.0
t2 = 0.450000000000003

要移除3千万亿个神器,您应该对结果进行舍入。

答案 4 :(得分:-1)

为什么要使用int?

相反如此:

import Darwin

let x = 3.1415926
let xf = x - (x > 0 ? floor(x) : ceil(x))

此处默认使用双打。如果它是您需要的,请随意使用花车:

let x: Float = 3.1415926

这就是你要找的东西吗?