Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Decimal、正しく使ってる? / Are you using Decimal correctly?

Elvis Shi
December 15, 2021

Decimal、正しく使ってる? / Are you using Decimal correctly?

Elvis Shi

December 15, 2021
Tweet

More Decks by Elvis Shi

Other Decks in Programming

Transcript

  1. %FDJNBMɺਖ਼͘͠࢖ͬͯΔʁ
    forJ1IPOF%FW4BQQPSPGFBU)","5"TXJGU

    View Slide

  2. }
    var employedBy = "YUMEMI Inc."


    var job = "iOS Tech Lead"


    var favoriteLanguage = "Swift"


    var twitter = "@lovee"


    var qiita = "lovee"


    var github = "el-hoshino"


    var additionalInfo = """


    M1 Max MacBook Proࠓ೔ಧ͍ͨʂ


    """
    final class Me: Developable, Talkable {

    View Slide

  3. ʲ଎ใʳΏΊΈɺ҉߸௨՟Λൃߦʂ
    ˞ӕͰ͢ɻ

    View Slide

  4. ͱ͍͏Θ͚Ͱ

    ΏΊΈͷڅ༩͸:VNF$PJOͰࢧڅʹ
    ˞ӕͰ͢ɻ

    View Slide

  5. // ࠓ݄ͷڅ༩


    var myYumeCoin = 0.2


    // ࠓ݄ͷϘʔφε


    myYumeCoin += 0.1


    // ϘʔφεΛ࢖ͬͯങ͍෺ʂ


    myYumeCoin -= 0.1


    // ࢒ߴ֬ೝ


    print(myYumeCoin) // 0.20000000000000004 ??????

    View Slide

  6. ͳͥ͜Μͳ͜ͱ͕ى͜Δͷ͔
    w 4XJGUͰখ਺Λѻ͏ͱ͖ɺσϑΥϧτͰ͸Double͕
    ࢖ΘΕΔ
    w Double͸ʮഒਫ਼౓ුಈখ਺఺਺ʯͳͷͰɺਫ਼౓ͷ໰
    ୊Ͱͦ΋ͦ΋ਖ਼֬ʹදͤͳ͍਺ࣈ͕ͨ͘͞Μ͋Δ
    w େ఍ͷ৔߹͸ͦͷؙΊΒΕͨ਺ࣈͰ΋໰୊ʹͳΒͳ͍
    ͕ɺۚ༥ܥͳͲͷ৔߹͸ਖ਼֬ʹѻ͏ඞཁ͕͋Δ

    View Slide

  7. Decimal

    View Slide

  8. Decimalܕ
    w ුಈখ਺఺਺Λेਐ਺ϕʔεͰѻ͏ͨΊͷܕ
    w ༗ޮܻ਺͕ܻ
    w ༗ޮܻ਺ൣғ಺Ͱ͋Ε͹ेਐ਺දهͷޡ͕ࠩͳ͍

    View Slide

  9. // ࠓ݄ͷڅ༩


    var myYumeCoin = 0.2


    // ࠓ݄ͷϘʔφε


    myYumeCoin += 0.1


    // ϘʔφεΛ࢖ͬͯങ͍෺ʂ


    myYumeCoin -= 0.1


    // ࢒ߴ֬ೝ


    print(myYumeCoin) // 0.20000000000000004 ??????

    View Slide

  10. import Foundation


    // ࠓ݄ͷڅ༩


    var myYumeCoin: Decimal = 0.2


    // ࠓ݄ͷϘʔφε


    myYumeCoin += 0.1


    // ϘʔφεΛ࢖ͬͯങ͍෺ʂ


    myYumeCoin -= 0.1


    // ࢒ߴ֬ೝ


    print(myYumeCoin) // 0.2 🎉
    'PVOEBUJPO͕ඞཁ
    ܕΛ໌ࣔతʹ%FDJNBMʹࢦఆ

    View Slide

  11. DecimalɺŜƃŤƄƃŬžŜŘŢŦ

    View Slide

  12. DecimalɺŜƃŤƄƃŬžŜŘŢŦ
    ͱɺࢥͬͨʁ

    View Slide

  13. import Foundation


    // ࠓ݄ͷڅ༩


    var myYumeCoin: Decimal = 0.2


    // ࠓ݄ͷϘʔφε


    myYumeCoin += 0.1


    // ϘʔφεΛ࢖ͬͯങ͍෺ʂ


    myYumeCoin -= 0.1


    // ࢒ߴ֬ೝ


    print(myYumeCoin) // 0.2 🎉

    View Slide

  14. import Foundation


    // ࠓ݄ͷڅ༩


    var myYumeCoin: Decimal = 0.2


    // ࠓ݄ͷϘʔφε


    myYumeCoin += 0.1


    // ϘʔφεΛ࢖ͬͯങ͍෺ʂ


    myYumeCoin -= 0.1


    // Decimal Λ࢖ͬͯਖ਼֬ͳڅ༩ܭࢉ͕Ͱ͖͔ͨΒ͍͑΍Ϙʔφεʂ


    myYumeCoin += 123.456


    // ࢒ߴ֬ೝ


    print(myYumeCoin) // 123.65599999999997952 !!!?????

    View Slide

  15. DecimalɺūŬŹƂŜŽūŘ

    View Slide

  16. DecimalͷϦςϥϧ୅ೖ
    w খ਺ϦςϥϧͰDecimalΛ୅ೖͰ͖Δͷ͸ɺ
    ExpressibleByFloatLiteralΛར༻ͨ݁͠Ռ
    w ࣮૷͸init(floatLiteral value: Double)
    w DecimalΛ࡞Δલʹͦ΋ͦ΋ઌʹҰճDoubleΛ
    ࡞ͬͯͦͷ݁ՌΛ୅ೖ͍ͯ͠Δ͚ͩʂ

    View Slide

  17. খ਺ϦςϥϧͰ

    DecimalΛ୅ೖ͠ͳ͍Ͱʂ

    View Slide

  18. %FDJNBMΛखܰʢʁʣʹѻ͏ͨΊͷ

    ΠχγϟϥΠβʔ
    • init(_ value: String, format: Decimal.FormatStyle,
    lenient: Bool = true) throws // iOS 15+


    • init?(string: String, locale: Locale? = nil) // iOS 7+


    • // etc…

    View Slide

  19. import Foundation


    // ࠓ݄ͷڅ༩


    var myYumeCoin: Decimal = 0.2


    // ࠓ݄ͷϘʔφε


    myYumeCoin += 0.1


    // ϘʔφεΛ࢖ͬͯങ͍෺ʂ


    myYumeCoin -= 0.1


    // Decimal Λ࢖ͬͯਖ਼֬ͳڅ༩ܭࢉ͕Ͱ͖͔ͨΒ͍͑΍Ϙʔφεʂ


    myYumeCoin += 123.456


    // ࢒ߴ֬ೝ


    print(myYumeCoin) // 123.65599999999997952 !!!?????

    View Slide

  20. import Foundation


    // …


    // Decimal Λ࢖ͬͯਖ਼֬ͳڅ༩ܭࢉ͕Ͱ͖͔ͨΒ͍͑΍Ϙʔφεʂ


    //myYumeCoin += 123.456


    // ࠓ౓ͦ͜ʂ


    myYumeCoin += try! .init("123.456", format: .number)


    // ࢒ߴ֬ೝ


    print(myYumeCoin) // 123.656 🎉

    View Slide

  21. DecimalɺͪΐͬͱͰ͖͔ͨͳ

    View Slide

  22. ʲࢀߟʳ

    View Slide

  23. IUUQTGPSVNTTXJGUPSHUIPXUPJOJUJBMJ[FEFDJNBM

    View Slide

  24. IUUQTJEFBMSFBMJUZDPNQSPHSBNJOHTXJGUEFDJNBMTUSJOH

    View Slide

  25. ʲએ఻ʳ

    View Slide

  26. IUUQTZVNFNJDPOOQBTTDPNFWFOU

    View Slide

  27. IUUQTXXXZVNFNJDPKQDBUFHPSZSFDSVJU

    View Slide