Advertisement
zergon321

Golang float64 computation error handling (reliable)

Dec 5th, 2022
679
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Go 1.91 KB | None | 0 0
  1. package main
  2.  
  3. import (
  4.     "fmt"
  5.     "strconv"
  6.     "strings"
  7. )
  8.  
  9. func Pow(base, degree int) int {
  10.     result := 1
  11.  
  12.     for i := 0; i < degree; i++ {
  13.         result *= base
  14.     }
  15.  
  16.     return result
  17. }
  18.  
  19. func Max(a, b int) int {
  20.     if a > b {
  21.         return a
  22.     }
  23.  
  24.     return b
  25. }
  26.  
  27. func computePreciselyMul(a, b float64) float64 {
  28.     aStr := fmt.Sprintf("%f", a)
  29.     bStr := fmt.Sprintf("%f", b)
  30.  
  31.     aParts := strings.Split(aStr, ".")
  32.     bParts := strings.Split(bStr, ".")
  33.  
  34.     aFactor := 1
  35.     bFactor := 1
  36.  
  37.     if len(aParts) >= 2 {
  38.         aFactor = Pow(10, len(aParts[1]))
  39.     }
  40.  
  41.     if len(bParts) >= 2 {
  42.         bFactor = Pow(10, len(bParts[1]))
  43.     }
  44.  
  45.     factor := aFactor * bFactor
  46.     a *= float64(aFactor)
  47.     b *= float64(bFactor)
  48.  
  49.     return a * b / float64(factor)
  50. }
  51.  
  52. func computePreciselyDiff(a, b float64) float64 {
  53.     aStr := strconv.FormatFloat(a, 'f', -1, 64)
  54.     bStr := strconv.FormatFloat(b, 'f', -1, 64)
  55.  
  56.     aParts := strings.Split(aStr, ".")
  57.     bParts := strings.Split(bStr, ".")
  58.  
  59.     aFactor := 1
  60.     bFactor := 1
  61.  
  62.     if len(aParts) >= 2 {
  63.         aFactor = Pow(10, len(aParts[1]))
  64.     }
  65.  
  66.     if len(bParts) >= 2 {
  67.         bFactor = Pow(10, len(bParts[1]))
  68.     }
  69.  
  70.     factor := Max(aFactor, bFactor)
  71.     a *= float64(factor)
  72.     b *= float64(factor)
  73.  
  74.     return (a - b) / float64(factor)
  75. }
  76.  
  77. func main() {
  78.     a := 10.0
  79.     b := 9.8
  80.     c := a - b
  81.  
  82.     fmt.Println(c)
  83.  
  84.     rounded := computePreciselyDiff(a, b)
  85.  
  86.     fmt.Println(rounded)
  87.  
  88.     a = 0.2
  89.     b = 0.05
  90.     c = a - b
  91.  
  92.     fmt.Println(c)
  93.  
  94.     rounded = computePreciselyDiff(a, b)
  95.     fmt.Println(rounded)
  96.  
  97.     a = 0.2
  98.     b = 0.000005
  99.     c = a - b
  100.  
  101.     fmt.Println(c)
  102.  
  103.     rounded = computePreciselyDiff(a, b)
  104.     fmt.Println(rounded)
  105.  
  106.     a = 0.2
  107.     b = 0.000000005
  108.     c = a - b
  109.  
  110.     fmt.Println(c)
  111.  
  112.     rounded = computePreciselyDiff(a, b)
  113.     fmt.Println(rounded)
  114.  
  115.     a = 2090.5
  116.     b = 8.61
  117.     c = a * b
  118.  
  119.     fmt.Println(c)
  120.  
  121.     rounded = computePreciselyMul(a, b)
  122.     fmt.Println(rounded)
  123.  
  124.     fmt.Println(len("0.1999999999999993") - 2)
  125.     fmt.Println(len("1000000000000") - 1)
  126. }
  127.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement