質問編集履歴

1 調査結果の追記

_utah

_utah score 20

2017/02/14 10:13  投稿

swiftでDouble型の切り捨てを誤差なく行いたい
###前提・実現したいこと
swiftでDouble型の切り捨てがしたい。
現在、型変換と切り捨てを行う汎用的に使える関数を製作しております。
ソースコードに乗せているものは、Double型の数値を受け取り、小数点第二位で切り捨てを行った後、Double型で値を返しています。
###発生している問題・エラーメッセージ
1.50...という値に小数点第二位で切り捨てをかけると、1.4という値が出てきてしまいます。
浮動小数点で誤差が出てしまうことを修正したいです。
###該当のソースコード
```swift
   static func FloorDtoD(number : Double) -> Double{
       
       return Double(Int(number * Double(10.0))) / Double(10.0)
   }
```
```swift
   static func FloorDtoD(number : Double) -> Double{
       
       var ansser : Double = number
       ansser = ansser * Double(10.0)
       ansser = floor(ansser)
       return ansser / Double(10.0)
   }
```
###試したこと
nsdecimalnumberを使用した方法も試しましたが、きちんと切り捨てられない(切り捨ててない)ことや、nsdecimalnumberをDouble型に変換し直さないといけないため、正しい値が得られませんでした。
nsdecimalnumberでStringを使用する方法は、まだ、試せていません。
###補足情報(言語/FW/ツール等のバージョンなど)
swift2.3
Xcode7.3.1
Xcode7.3.1
追記になります
```swift
   static func FloorDtoD(number : Double) -> Double{
       
       let str : String = String(number)
       let ansser : NSDecimalNumber = NSDecimalNumber(string : str)
       
       let behavior = NSDecimalNumberHandler(
           roundingMode: .RoundDown,
           scale: 2,
           raiseOnExactness: false,
           raiseOnOverflow: false,
           raiseOnUnderflow: false,
           raiseOnDivideByZero: false)
       
       return Double(ansser.decimalNumberByRoundingAccordingToBehavior(behavior))
   }
```
こちらでも、1.5ではなく、1.4になってしまう場合があることを確認しました。
また、引数のnumberですが、こちらには1.5が入っていることを確認しました。
  • Xcode

    6867 questions

    Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

  • Swift

    11973 questions

    Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

  • Swift 2

    1352 questions

    Swift 2は、Apple社が独自に開発を行っている言語「Swift」のアップグレード版です。iOSやOS X、さらにLinuxにも対応可能です。また、throws-catchベースのエラーハンドリングが追加されています。

  • Xcode 7

    620 questions

    Xcode 7は、ソフトウェア開発のためのアップルの統合開発環境であるXcodeのバージョン。UIを作成するために用いるグラフィカルツールです。iOS9/OS X El Capitan/watchOS2に対応。Swift 2コンパイラーが搭載されています。

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る