objective-c - periodicos - radicacion de fracciones ejercicios resueltos
Swift obtiene la fracción de flotación (5)
He estado probando rápido últimamente y me he encontrado con un problema bastante simple.
En Obj-C cuando quiero obtener los dígitos de fracción de una carroza, haré lo siguiente:
float x = 3.141516
int integer_x = (int)x;
float fractional_x = x-integer_x;
//Result: fractional_x = 0.141516
en Swift:
let x:Float = 3.141516
let integerX:Int = Int(x)
let fractionalX:Float = x - integerX
-> esto da como resultado un error debido a los tipos que no se están aplicando
¿Alguna Idea de cómo hacerlo correctamente?
Gracias por adelantado
Malte
¿Por qué usar un int en absoluto?
¿Qué pasa con esto en su lugar?
import Darwin
let x = 3.1415926
let xf = x - (x > 0 ? floor(x) : ceil(x))
Utilizará dobles por defecto aquí. Siéntase libre de usar flotadores si es lo que necesita:
let x: Float = 3.1415926
¿Es esto lo que estás buscando?
A Swift 3 no le gusta el operador de módulo %
. Quiere que use truncatingRemainder
de tipo 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)")
Produce salida:
t1 = 0.0
t2 = 0.450000000000003
Para eliminar el artefacto 3 cuadrillonésimo, probablemente redondees el resultado.
El problema es que no puedes restar Float e Int, debes convertir uno de este valor para que sea igual a otro, intenta eso:
let fractionalX:Float = x - Float(integerX)
Use el operador de módulo: ( x% 1 ), que
- inmediatamente (es solo un personaje), y
- con pocos ciclos de CPU (presumiblemente solo un ciclo, ya que el módulo es una instrucción de CPU común)
da la parte fraccional.
let x:Float = 3.141516
let fracPart = x%1
fracPart
asumirá el valor: 0.141516 . Esto funciona para el double
y float
, sin embargo, el double
devuelve erróneamente 0.1415160000000002 en mi Mac en el patio de recreo, así que esté alerta.
Use la función modf
:
let v = 3.141516
var integer = 0.0
let fraction = modf(v, &integer)
println("fraction: /(fraction)");
salida:
fracción: 0.141516
Para flotador en lugar de doble uso: modff