1. ホーム
  2. swift

[解決済み】swiftでDoubleを最も近いIntに丸めるには?

2022-04-13 02:56:25

質問

成長率の計算機を作ろうとしているのですが( Double ) のように、結果を最も近いIntegerに丸め、そこから再計算するようにします。

let firstUsers = 10.0
let growth = 0.1
var users = firstUsers
var week = 0


while users < 14 {
    println("week \(week) has \(users) users")
    users += users * growth
    week += 1
}

が、今のところできないでいます。

EDIT なんとなくこんな感じでやってみました。

var firstUsers = 10.0
let growth = 0.1
var users:Int = Int(firstUsers)
var week = 0


while users <= 14 {
    println("week \(week) has \(users) users")
    firstUsers += firstUsers * growth
    users = Int(firstUsers)
    week += 1
}

常に切り捨てであることは気にならないのですが、以下の点が気に食わないのです。 firstUsers が変数になり、(次の計算をするために)プログラム全体で変化しなければならず、そうなって欲しくはないのです。

どのように解決するのですか?

があります。 round で利用可能です。 Foundation ライブラリ (にあります(実際には Darwin しかし Foundation 輸入品 Darwin を使いたい場合がほとんどでしょう。 Foundation を使用するのではなく Darwin 直接) .

import Foundation

users = round(users)

プレイグラウンドでコードを実行し、そして呼び出す。

print(round(users))

出力します。

15.0

round() は常に切り上げ、小数点以下が >= .5 のときは下げます。 < .5 (標準的な丸め方)。を使用することができます。 floor() で四捨五入を強制し ceil() を指定すると、強制的に丸められます。

特定の場所に丸める必要がある場合は、掛け算をします。 pow(10.0, number of places) , round で割る。 pow(10, number of places) :

小数点以下2桁に丸める。

let numberOfPlaces = 2.0
let multiplier = pow(10.0, numberOfPlaces)
let num = 10.12345
let rounded = round(num * multiplier) / multiplier
print(rounded)

出力します。

10.12

浮動小数点演算の仕組みに起因します。 rounded は、必ずしも完全に正確であるとは限りません。どちらかというと、丸めの近似値と考えた方がよいでしょう。表示目的で行うのであれば、数学で丸めるのではなく、文字列フォーマットで数値を整形したほうがよいでしょう。