Swift

Swift:Int vs. Double 知らぬが仏とは!

文字列の数字をIntとDoubleに直すところで、すっかりはまっていました。

ことの発端は、小数点第6位で四捨五入もしくは切り捨てした浮動小数点Doubleを辞書に書き込むと、結果がシステムによって変えられてしまうらしいという問題の調査からはじまったのですが、そもそもどこで何が起きているか、なかなか把握できないことも問題でした。

トレースをとればすぐにわかりそうな話なのですが、そうでもなかったのでボロボロになりました。

結論を先に言うと次の通りです。これらはわかりきったことのはず。

Double(“9876543210.12345”)➡️9876543210.12345
Int(“9876543210”)➡️️9876543210
Int(“️9876543210.1234”)➡️nil
Int(Double(“️9876543210.1234”)!)➡️️9876543210

(“9876543210.12345” as NSString).doubleValue➡️️9876543210.12345
(“9876543210.12345” as NSString).integerValue➡️️9876543210

問題は、次のことを全く予想できなかったことです。

let wX = ExecDoubletest()
print(“—–> \((wX))”)
//———————————————————–
func ExecDoubletest() -> NSMutableArray {
        let wT:NSMutableArray = [[Int(0)],[Double(0.0)]]
        let wDouble:Double = 9999.12345
        wT[0]   = Int(Double(wDouble))
        wT[1]   = Double(wDouble)
        return wT

期待されることは、9999.12345を得ることです。

しかし、結果は、9999.123449999999になります。私の場合、これを最初に見たものですから、何日も右往左往した末、ようやくひとつの結論に達したのです。このような変換結果になる固定小数点はいくつも存在します。

しかし、ようやく、wT[1]には、9999.12345が入っている、と知ることができました

皆様も、setした値が9999.12345なのにこのような違う値になってしまった場合、どうすればいいか、どう考えるべきか、ご検討ください。この場合も、必ず意図した通りの結果を取り出す方法があります。

私の場合、ここまではわかったのですが、この先がまだわからないままです。わからないことは常になくなりません。ソクラテスが言うように分からないことを知ることが本当にわかることなのかもしれません。ただし、その場合、残念なことがあります。それ以上先に行けないからです。

 

Categories: Swift, 技術