質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Xcode

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

Swift

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

Q&A

解決済

3回答

958閲覧

swift4: 文字列を正確に計算したい

Nippun

総合スコア1147

Xcode

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

Swift

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

0グッド

1クリップ

投稿2018/10/19 14:19

編集2018/10/19 14:40

文字列の数式を正確に計算したいです。
例えば、"(1.2345 - 1.2340) * 1000"をDoubleで計算すると0.4999999999999448になってしまいます。
どのようにすれば、文字列の数式を正確に計算できますか?
NSDecimalNumberをNSExpressionを使って計算しようと思ったのですがうまくいきませんでした。
できればDecimal型にしたいです

swift

1import UIKit 2 3 4(1.2345 - 1.2340) * 1000 5 6var eqn = "(1.2345 - 1.2340) * 1000" 7var a = NSDecimalNumber(string: "1.2345") 8var b = NSDecimalNumber(string: "1.2340") 9var c = NSDecimalNumber(string: "1000") 10 11 12func + (lhs: NSDecimalNumber, rhs: NSDecimalNumber) -> NSDecimalNumber { 13 return lhs.adding(rhs) 14} 15 16func - (lhs: NSDecimalNumber, rhs: NSDecimalNumber) -> NSDecimalNumber { 17 return lhs.subtracting(rhs) 18} 19 20func * (lhs: NSDecimalNumber, rhs: NSDecimalNumber) -> NSDecimalNumber { 21 return lhs.multiplying(by: rhs) 22} 23 24func / (lhs: NSDecimalNumber, rhs: NSDecimalNumber) -> NSDecimalNumber { 25 return lhs.dividing(by: rhs) 26} 27(a - b) * c 28 29let exp = NSExpression(format: eqn) 30exp.expressionValue(with: nil, context: nil) as? NSDecimalNumber

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

自己解決

アルゴリズムつくれました。

投稿2018/10/21 19:04

Nippun

総合スコア1147

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

これで普通にできますけど、どこかわからないのでしょうか?

swift

1import Foundation 2 3let a = Decimal(string: "1.2345") 4let b = Decimal(string: "1.2340") 5let c = Decimal(string: "1000") 6 7let r = a.flatMap { aa in b.flatMap { bb in c.map { cc in (aa - bb) * cc } } } 8r.map { print($0) }

投稿2018/10/20 02:40

MasakiHori

総合スコア3384

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

浮動小数点変数を使う限りは不可能です

小数点以下4桁、と決まっているなら、数値を*10000して整数計算して、出力のときに10000で割りましょう

投稿2018/10/19 22:55

編集2018/10/19 23:00
y_waiwai

総合スコア87774

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Zuishin

2018/10/19 23:37

だから decimal を使いたいという質問では?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問