我有整数 XY 和 Z
我有这个公式用于填充 float[][] 数组
公式是 x/(y*(x+z) 其中所有 3 都是整数
但是当计算的值为0时,这绝对不是我检查xy和z的值。
我该如何防止这种情况并改为显示浮点值?
提前谢谢了
我有整数 XY 和 Z
我有这个公式用于填充 float[][] 数组
公式是 x/(y*(x+z) 其中所有 3 都是整数
但是当计算的值为0时,这绝对不是我检查xy和z的值。
我该如何防止这种情况并改为显示浮点值?
提前谢谢了
您必须将整数(或只是第一个)转换为 float :
float result = ((float)x)/(y*(x+z));
这将使/
操作员从操作中产生一个浮点数。
不要忘记检查你没有被零除。
尝试这个:
float a = x / (1.F * y * (x + z));
我假设你正在做这样的事情:
floats[i][j] = x / (y * (x + z));
问题是 RHS 的计算是使用整数算术完成的……因为所有的值都是整数。特别是,除法是整数除法,这意味着(例如)如果0 <= x < (y * (x + z)
,则表达式的计算结果最多为零。
解决方案是强制使用浮点运算执行除法。
问题的第二个方面是存在整数溢出的风险。特别是,y * (x + z)
如果一个或多个输入太大,子表达式可能会溢出。这将导致该部分计算的值非常不正确。
溢出问题的解决方案是强制整个计算以浮点数进行……而不仅仅是最后的除法;例如
floats[i][j] = x / (y * ((float) x + z));
最后,如果您希望结果准确(或尽可能准确),您可能应该使用double
而不是float
. 问题float
在于它只表示最大精度为 24 位的数字。这大约是 7 位十进制数字。除非性能或存储很重要,否则double
它是首选,因为它可以为您提供 53 位的精度。这大约是 14 位十进制数字。