Golang中结构体和接口的问题解析

Golang中结构体和接口的问题解析 我们编写的代码如下:

package main
import "fmt"

type Rectangle struct {
    Length, Width float32
}

type Circle struct {
    Radius float32
}

func (r *Rectangle) Area() float32 {
    return r.Length * r.Width
}

func (r *Rectangle) Perimeter() float32 {
    return 2 * (r.Length + r.Width)
}

func (c *Circle) Area() float32 {
    const PI float32 = 3.144444444444
    return PI * (c.Radius  * c.Radius)
}

func (c *Circle ) Circumference() float32 {
    const PI float32 =  3.14444444444
    return 2 * (PI * c.Radius)
}

func main() {
var r Rectangle   
var c Circle 
    var first float32
    fmt.Scanln(&first)
    var second float32
    fmt.Scanln(&second)
    var third float32
    fmt.Scanln(&third)
r.Length = first
r.Width = second
c.Radius = third
fmt.Println(r.Area())
fmt.Println(r.Perimeter())
fmt.Println(c.Area())
fmt.Println(c.Circumference())
}

这里第一个输入是5,第二个是6,第三个是5。

我们的问题在于圆的输出似乎存在一些浮点数问题,不确定哪里出错了,因此需要建议。

你的输出 30 22 78.611115 31.444445

期望的输出 30 22 78.53981633974483 31.41592653589793


更多关于Golang中结构体和接口的问题解析的实战教程也可以访问 https://www.itying.com/category-94-b0.html

4 回复

问题已解决,感谢,在 PI 值之后 🙂

更多关于Golang中结构体和接口的问题解析的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


请先等待 @NobbZ 的解释,或者直接等待下方 @petrus 的复制粘贴代码。👇

不确定我们哪里出错了

你将 PI 定义为 3.1444444,但这并不是 PI 的值。你期望的输出使用了正确的 PI 值。PI 在 math 包中已有定义,所以请直接使用那里的值:math package - math - Go Packages

问题出在圆周率常量的精度上。Go语言中float32类型精度有限,而您使用的π值精度不足。以下是修正后的代码:

package main
import (
    "fmt"
    "math"
)

type Rectangle struct {
    Length, Width float32
}

type Circle struct {
    Radius float32
}

func (r *Rectangle) Area() float32 {
    return r.Length * r.Width
}

func (r *Rectangle) Perimeter() float32 {
    return 2 * (r.Length + r.Width)
}

func (c *Circle) Area() float32 {
    return float32(math.Pi) * (c.Radius * c.Radius)
}

func (c *Circle) Circumference() float32 {
    return 2 * float32(math.Pi) * c.Radius
}

func main() {
    var r Rectangle   
    var c Circle 
    var first float32
    fmt.Scanln(&first)
    var second float32
    fmt.Scanln(&second)
    var third float32
    fmt.Scanln(&third)
    
    r.Length = first
    r.Width = second
    c.Radius = third
    
    fmt.Println(r.Area())
    fmt.Println(r.Perimeter())
    fmt.Println(c.Area())
    fmt.Println(c.Circumference())
}

主要修改:

  1. 导入math包,使用math.Pi常量(float64精度)
  2. math.Pi转换为float32类型以保持类型一致
  3. 移除自定义的低精度π常量

使用math.Pi(约3.141592653589793)能获得更精确的计算结果。输入5,6,5时,输出将接近期望值:

  • 圆面积:78.53982
  • 圆周长:31.415928

注意:由于float32精度限制,结果仍会与float64计算的结果有细微差异。如果需要更高精度,建议将结构体字段类型改为float64

回到顶部