是否可以使用一些构造来替换所有具有双精度(或相反)的浮动而不进行重构?
例如,您可能正在实施一些与浮点数或双精度数完全互换的数学系统。在C中,您可以使用:typedef float real
,然后在代码中使用real
。更改为double只涉及替换一行代码。
在Java中这样的事情是可能的吗?或者是否有一些通用的数字类型?
答案 0 :(得分:2)
在您描述的直接案例中,这在Java中是不可能的。但是,根据代码的工作方式,您可以将数学类编写到接口,并且所有返回值的方法都可以使用double和float返回类型来实现。然后,您可以编写两个实现类,并根据您要使用的实现类进行切换。
这看起来有点矫枉过正。你为什么要这样做?
答案 1 :(得分:0)
实际上建议使用BigDecimal而不是float / double。不要认为java有类似于typedef float real的东西
答案 2 :(得分:0)
您可以使用面向对象的方法。
创建自己的类,实现数学系统所需的方法。使用此类而不是float。在里面它可以使用你想要的任何浮动,双或BigDecimal。您可以稍后更改课程的工作方式,而无需更改系统的其余部分。
看看Double,它将给出如何构建它的一般想法。
实施加法,乘法等方法。
E.g:
public class MyDecimal
{
private float value;
public MyDecimal(int value)
{
this.value = value;
}
public MyDecimal(float value)
{
this.value = value;
}
public MyDecimal multiply(MyDecimal by)
{
return new MyDecimal(value * by.value);
}
...
}
所以,如果你想使用double而不是float,你只需要改变这个类。
答案 3 :(得分:0)
不,没有办法在原始类型的Java中实现这一点。没有typedef等价物,也没有模板类。从功能上看,可以以面向对象的方式工作,方法将采用包装类/接口类型(类似于java.lang.Number),并将结果作为包装类型返回。
但是,我只是废弃了整个想法,只实现了双版本。想要使用float的调用者可以使用任何方法的双重版本 - 参数将自动加宽为double。然后,调用者需要将结果转换回浮动状态。往返双倍的转换会花费一点点速度。或者如果double很好,你可以使用float,只创建一个浮动版本。
就原始计算速度而言,float和double(在桌面CPU上)之间几乎没有区别。浮动的速度优势通常主要来自减少的内存带宽要求。
如果只有一个或几个实用程序类,您还可以有两组(例如FloatMathUtil和DoubleMathUtil)。然后由用户决定对哪一个进行编码(就API而言,它们将是完全不相关的类)。