我有这段代码,假设打印单个形状的区域,然后打印总面积(各个区域的总和),但是当我使用接口和可变参数时,在添加的某处似乎存在问题功能。该程序是用GoLang编写的,下面是代码;
/* Program that interacts with shapes */
/* Calculating the area of basic shapes e.g Circle, Rectangle */
package main
import ("fmt"; "math")
/* Adding the interface support */
type Shape interface {
area() float64
}
/* Struct for Circle */
type Circle struct {
x, y, r float64
}
/* Struct for Rectangle */
type Rectangle struct {
x1, y1, x2, y2 float64
}
/* Calculation of distance */
func distance(x1, y1, x2, y2 float64) float64 {
a := x2 - x1
b := y2 - y1
return math.Sqrt(a*a + b*b)
}
/* Area of the rectangle */
func (r *Rectangle) area() float64 {
l := distance(r.x1, r.y1, r.x1, r.y2)
w := distance(r.x1, r.y1, r.x2, r.y1)
return l * w
}
/* Area of the circle */
func (c *Circle) area() float64 {
return math.Pi * c.r * c.r
}
/* Interface is really useful when finding the total area i.e. the sum of
all the areas of each of the shapes
*/
func totalArea(shapes ...Shape) float64 {
var area float64
for _, s := range shapes {
area += s.area()
}
return area
}
/* This is the main function */
func main() {
c := Circle{0, 0, 5}
r := Rectangle{0, 0, 10, 10}
fmt.Println("Area of the rectangle is: ", r.area())
fmt.Println("Area of the circle is: ", c.area())
fmt.Println("Sum of the areas: ", totalArea(&c, &r))
}
我在Mac OS X El Capitan上运行此代码,核心i5,8GB RAM以下是我的输出
Area of the rectangle is: 100
Area of the circle is: 78.53981633974483
Sum of the areas: 178.53981633974485
从结果中可以看出,存在一个小问题,预期的区域总和应为:178.53981633974483
但我得178.53981633974485
0.00000000000002
不同或偏离预期的结果,请任何人帮我解释为什么会这样?
我不太确定GoLang中的数学库是否存在问题,因为它只需要正常添加这两个区域?或者是GoLang在将该区域传递给totalArea()
之前重新计算该区域然后做了一些近似我不太明白吗?或者是我的电脑(人们永远无法分辨)?
提前感谢您的帮助。
答案 0 :(得分:0)
这是浮点运算及其精度的行为,而不是golang特有的。
关于浮动精度的一些很好的资源。
这是一个片段,更简单地说明了您的问题:
https://play.golang.org/p/Jhlnt0L13T
如果您确实需要任意精度,那么您可能需要查看: