【问题标题】:How to perform division in Go如何在 Go 中执行除法
【发布时间】:2015-12-25 05:55:48
【问题描述】:

我正在尝试在 Go 中执行一个简单的除法。

fmt.Println(3/10)

这会打印 0 而不是 0.3。这有点奇怪。有人可以分享这背后的原因吗?我想在 Go 中执行不同的算术运算。

谢谢

【问题讨论】:

    标签: math go floating-point integer-division


    【解决方案1】:

    表达式3 / 10 是一个无类型的常量表达式。规范says this about constant expressions

    如果二元运算的操作数是不同类型的无类型常量,则该运算以及非布尔运算的结果使用此列表后面出现的类型:整数、符文、浮点数、复数。

    因为310 是无类型整数常量,所以表达式的值是无类型整数(在本例中为0)。

    其中一个操作数必须是浮点常数,才能将结果转为浮点常数。以下表达式计算为无类型浮点常量0.3

    3.0 / 10.0
    3.0 / 10
    3 / 10.0
    

    也可以使用类型化常量。以下表达式计算为 float64 常量 0.3

    float64(3) / float64(10)
    float64(3) / 10
    3 / float64(10)
    

    打印任何上述表达式将打印0.3。例如,fmt.Println(3.0 / 10) 打印 0.3

    【讨论】:

    • 我正在接受输入,假设它是百分比。例如,如果用户给出 30,我必须执行 30/100 * somenumber。输入将始终为整数。在这种情况下如何进行除法?
    • Convert 整数转浮点数。
    • 我试过 fmt.Println(float64(3/10)) 但它给了我 0
    • @VrushankDoshi: fmt.Println(float64(3) / float64(10)) 给了0.3
    【解决方案2】:

    @Cerise 所述并按照规范

    算术运算符适用于数值并产生与第一个操作数类型相同的结果。

    在这种情况下,只有 第一个操作数需要是浮点数。

    fmt.Println(3.0/10)
    fmt.Println(float64(3)/10)
    // 0.3 0.3
    

    Example

    【讨论】:

    • 是的!只是第一个操作数
    • 并不总是成功,如果“10”被检测为int,那么这将引发以下错误:无效操作:(不匹配的类型float64和int)
    • 你能指出我缺少什么吗?基本上,我在示例部分复制了您的代码,将fmt.Println(3.0/10) 更改为fmt.Println(3/10.0),并得到与更改第一个操作数相同的结果?也许在 golang 中有所改变 :) play.golang.org/p/5xqlAtNb8So
    • 我不得不说我没有答案,似乎第二个示例中的 3 由于某种原因没有被转换为 int:play.golang.org/p/5nT0rDEueWt
    • @Vor 和 robstarbuk:此答案中规范的引用不适用于答案中的常量表达式和 Vor 的评论。有关如何评估常量表达式的信息,请参阅section of the specification on constant expression。 Go 对常量表达式和非常量表达式的求值有不同的规则。
    猜你喜欢
    • 2016-04-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-17
    • 2015-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多