这个除法有什么问题?

3

我认为关于数据类型,还有很多需要学习的地方。 为什么会发生这种情况。

double result = ((3/8)*100).ToString();

出现了零,应该是37.5... :(


以后,请明确您所询问的语言。 - anon
1
当赋值给double时,为什么要使用.ToString? - snemarch
请提供一个与您的问题有关的标题。将以下与编程相关的内容从英语翻译成中文。仅返回翻译后的文本。 - unbeknown
什么编程语言允许字符串到双精度浮点数的赋值? - falstro
可能是[Ints和Doubles做除法]的重复问题(https://dev59.com/k07Sa4cB1Zd3GeqP7uhD)。 - xanatos
11个回答

12

3/8 进行整数除法,结果为 0

double result = ((3.0/8)*100);

应该这样做。

顺便提一下,如果你执行 ((3.0/8)*100).ToString(),你会得到一个字符串而不是一个双精度浮点数。


6
你需要说服编译器执行浮点数除法:
double result = (((double)3/8)*100);

否则,它会执行整数除法,3/8 就会变成零。

1
在常量中使用小数点,就可以避免那些丑陋的转换了 :) - snemarch
还有.ToString()的问题 :) - snemarch
1
ToString() 的确是个真的。丑陋的转换使其看起来更加明确。 - sharptooth

4
double result = ((3.0/8.0)*100);

应该这样做。你正在执行整数除法,而不是浮点数除法。


2

数字3和8都是整数,因此3/8 = 0。

使用:

string result = ((3d/8d)*100d).ToString();

这段代码无法编译;-) 将结果变成字符串或删除 .ToString()。 - Dirk Vollmar
糟糕 - 你说得对。现在已经修复了。谢谢。 - teedyay

2

你的表达式仅涉及整数,而3/8为0。

如果你想要一个浮点数表达式,至少一个元素必须是浮点数。

最简单的解决方案如下:

double result = (100.0 * 3/8)

请注意,我将百因子放在首位是因为在进行除法之前先进行乘法可以提高精度。
另外,toString() 方法很奇怪?

在使用浮点数时,先乘不太重要,但当您想保持整数时,它是有用的。 - starblue

1
整数除法(3/8)的结果为0。如果您想使用浮点数进行计算,请明确告诉您的编程语言(例如:3.0/8.0或3f/8f或3d/8d,或者其他您所用的语言允许的方式)。

1

3和8都是整数,因此3/8的结果也是整数,除非你以不同的方式进行转换。

所以,3/8 = 0。


1

独角兽拿走了数字3,并用0替换了它。

如果这是一个真正的问题... 3/8向下取整为0。0 * 100 = 0。


1

因为使用了整数运算,而不是浮点数运算。

您写的是((3/8)*100),但该表达式中的常量都没有非整数类型。因此编译器(正确地)将其解释为整数运算。由于3/8小于1,所以该表达式的值为0。

一个简单的解决方法是改为写((3./8.)*100.)。实际上,使3或8中的任何一个成为浮点值就足够了,因为混合类型表达式的规则。


0

你的除法中的3和8是整数字面量,因此执行整数除法,3/8的结果为零。如果你将它们替换为3.0和8.0,或者使用适当的数据类型后缀(你没有说明你使用的是哪种编程语言),那么计算就会正常工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接