Как мы должны считать деньги (десятичные, большие. Плавать) - PullRequest
1 голос
/ 25 сентября 2019

Может кто-нибудь подсказать правильный способ расчета финансовых данных в Go.Я пытался использовать big.Float, но, вероятно, я что-то упустил.Основная цель состоит в том, чтобы вычислить числа с точкой воспламенения и точностью от 2 до 4 без потерь.0.15 + 0.15 всегда должно быть 0,30.float попробовать: https://play.golang.org/p/_3CXtRRNcA0 big.Float попробовать: https://play.golang.org/p/zegE__Dit1O

Ответы [ 2 ]

5 голосов
/ 25 сентября 2019

Плавающая точка неточна.Используйте целые числа (int64), масштабированные до центов или дробных центов.


Например, центы,

package main

import (
    "fmt"
)

func main() {
    cents := int64(0)
    for i := 0; i <= 2; i++ {
        cents += 15
        fmt.Println(cents)
    }
    fmt.Printf("$%d.%02d\n", cents/100, cents%100)
}

Детская площадка: https://play.golang.org/p/k4mJZFRUGVH

Выход:

15
30
45
$0.45

Например, округлены до сотых долей цента,

package main

import "fmt"

func main() {
    c := int64(0) // hundredths of a cent
    for i := 0; i <= 2; i++ {
        c += 1550
        fmt.Println(c)
    }
    c += 50 // rounded
    fmt.Printf("$%d.%02d\n", c/10000, c%10000/100)
}

Детская площадка: https://play.golang.org/p/YGW9SC7OcU3

Вывод:

1550
3100
4650
$0.47
1 голос
/ 25 сентября 2019

вы можете попробовать https://github.com/shopspring/decimal, если вы действительно беспокоитесь о точности,

попробуйте этот код:

package main

import (
    "fmt"

    "github.com/shopspring/decimal"
)

func main() {

    z := decimal.NewFromFloat(0)

    b := decimal.NewFromFloat(0.15)

    z = z.Add(b)
    z = z.Add(b)
    z = z.Add(b)

    fmt.Println("z value:", z)

    testz := z.Cmp(decimal.NewFromFloat(0.45)) == 0

    fmt.Println("is z pass the test? ", testz)

}

Детская площадка: https://play.golang.org/p/g_fSGlXPKDH

Вывод:

z value: 0.45
is z pass the test?  true
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...