用双打替换所有浮子

时间:2013-05-03 12:28:31

标签: java numbers typedef

是否可以使用一些构造来替换所有具有双精度(或相反)的浮动而不进行重构?

例如,您可能正在实施一些与浮点数或双精度数完全互换的数学系统。在C中,您可以使用:typedef float real,然后在代码中使用real。更改为double只涉及替换一行代码。

在Java中这样的事情是可能的吗?或者是否有一些通用的数字类型?

4 个答案:

答案 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而言,它们将是完全不相关的类)。