owned this note changed 4 years ago
Published Linked with GitHub

我搞不懂浮點數:CS 101 - yllan

所有議程請見議程表

歡迎來到 https://hackmd.io/@iPlayground/2019 共筆

Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →

點擊本頁上方的 開始用 Markdown 一起寫筆記!
手機版請點選上方 按鈕展開議程列表。

YouTube

Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →

Slide

預備知識

  • 指數運算
2^3 = 2 * 2 * 2 = 8
2^0 = 1
2^(-3) = 1 / 8

議程目標

希望新手聽完,能知道浮點數運作原理。
老手能夠學到一些edge case。
大家都能避開常見的坑。

0.1+0.2

定點數

浮點數

19.9 ~ 10011.1110011001100

func testFloatEqual() {
    let e:Double = 1.9 * 10 * 10
    let r:Double = 1.9 * 100
    XCTAssertEqual(e, r) // V
    XCTAssertNotEqual(e.description, r.description) // X
}
    求講者怎麼測的?

浮點數的加法容易出現問題,盡量用乘的。誤差會比較小

與錢有關的,最好都不要扯上關係

DON'T: Use floating point type to store money

var m: Float = 0
for _ in 0..<1000000 {
    m += 0.01
}
// m = 9865.22363

DO: Use Decimal type to store money

var money: Decimal = 0
for _ in 0..<1000000 {
    money += Decimal(1) / Deciaml(100)
}
// money = 10000.000000

能用 Double 就不要用 Float

浮點數運算要避免大數字與小數字加減

range取 max(0.01, utl)

tags:iPlayground2019
Select a repo