斯威夫特得到漂浮的分数

Mal*_*lte 6 math objective-c type-conversion swift

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

在Obj-C中,当我想得到一个浮点数的小数位时,我会做以下事情:

float x = 3.141516
int integer_x = (int)x;
float fractional_x = x-integer_x;
//Result: fractional_x = 0.141516
Run Code Online (Sandbox Code Playgroud)

在斯威夫特:

let x:Float = 3.141516
let integerX:Int = Int(x)
let fractionalX:Float =  x - integerX 
Run Code Online (Sandbox Code Playgroud)

- >由于错误处理类型导致错误

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

提前致谢

马尔特

zap*_*aph 13

使用modf功能:

let v = 3.141516
var integer = 0.0
let fraction = modf(v, &integer)
println("fraction: \(fraction)");
Run Code Online (Sandbox Code Playgroud)

输出:

分数:0.141516

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

  • 我可以确认`let(a,b)= modf(x)`和`let d = modf(x,&c)`在编译的应用程序和我的playground文件中工作. - 实际上我发现`let(a,b)= modf(x)`更优雅,但你的代码编译并且对我来说没有问题. (4认同)
  • 你们都是对的。有`func modf(_:Double,_:UnsafePointer <Double>)-> Double` **和**`func modf(value:Double)->(Double,Double)`和Float变量。前者是从<math.h>导入的,后者似乎只是Swift。 (2认同)

Hen*_*ing 8

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

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

给出小数部分.

let x:Float = 3.141516
let fracPart =  x.truncatingRemainder(dividingBy: 1) // fracPart is now 0.141516
Run Code Online (Sandbox Code Playgroud)

fracPart将假设值:0.141516.这适用于doublefloat.


Gre*_*reg 4

问题是你不能减去 Float 和 Int,你应该将这个值之一转换为与另一个值相同,尝试:

let fractionalX:Float = x - Float(integerX)
Run Code Online (Sandbox Code Playgroud)