我有以下代码片段:
package main import("fmt";"flag") func main() { var a = flag.Int("a",0,"divident") var b = flag.Int("b",1,"divisor") flag.Parse() fmt.Printf("%f",*a / *b ) }
对于-a 3和-b 2命令行参数,输出为:%!f(int=1)什么是最好/最优雅的方法来强制这个除法是浮点数?
%!f(int=1)
vfh0ocws1#
有no implicit type casts for variables in Go,所以必须转换为浮点型:
fmt.Printf("%f", float32(a)/float32(b))
或
fmt.Printf("%f", float32(a/b))
这取决于你想要什么。也可以看看float64--如果它能让你的船浮起来的话。
float64
p8ekf7hl2#
必须先将类型转换为浮点型。通常,如果有一些非浮点型数值类型(例如int s)a和b,要获得浮点除法,请使用float32(a)/ float32(b)(或float64,视情况而定)。这也适用于任何其他数值类型,如果你想把浮点数当作整数或把整数当作复数来处理,转换操作数。在这种情况下,如果a是3,B是2,则float32(a)/float32(b)将是1.5。如果你想做整数除法,但是结果是浮点数,那么把结果转换成float32(a/b),在这种情况下,如果a是3,b是2,那么float32(a/b)会得到1.0。
int
a
b
float32(a)/ float32(b)
float32(a)/float32(b)
float32(a/b)
camsedfj3#
我对a或b的大值表示怀疑,因为即使它们的商不会溢出,到float32的单个转换也可能溢出。然而,测试这个here时,golang编译器似乎足够聪明,可以使float32(a)/float32(b)“正常工作”,因此构造如下
float32
f, _ := big.NewRat(a, b).Float32()
在这种情况下不必要。
nbnkbykc4#
那么你应该把除法的结果转换成float
4条答案
按热度按时间vfh0ocws1#
有no implicit type casts for variables in Go,所以必须转换为浮点型:
或
这取决于你想要什么。也可以看看
float64
--如果它能让你的船浮起来的话。p8ekf7hl2#
必须先将类型转换为浮点型。
通常,如果有一些非浮点型数值类型(例如
int
s)a
和b
,要获得浮点除法,请使用float32(a)/ float32(b)
(或float64
,视情况而定)。这也适用于任何其他数值类型,如果你想把浮点数当作整数或把整数当作复数来处理,转换操作数。在这种情况下,如果a是3,B是2,则float32(a)/float32(b)
将是1.5。如果你想做整数除法,但是结果是浮点数,那么把结果转换成
float32(a/b)
,在这种情况下,如果a是3,b是2,那么float32(a/b)
会得到1.0。camsedfj3#
我对
a
或b
的大值表示怀疑,因为即使它们的商不会溢出,到float32
的单个转换也可能溢出。然而,测试这个here时,golang编译器似乎足够聪明,可以使
float32(a)/float32(b)
“正常工作”,因此构造如下在这种情况下不必要。
nbnkbykc4#
那么你应该把除法的结果转换成float