1

是否可以使用某种构造来用双精度(或相反)替换所有浮点数而不进行重构?

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

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

4

4 回答 4

2

在您描述的简单情况下,这在 Java 中是不可能的。但是,根据您的代码的工作方式,您可以将数学类写入接口,并使用双精度和浮点返回类型来实现所有返回值的方法。然后,您可以编写两个实现类,并根据您要使用的类在它们之间切换。

这似乎有点矫枉过正。你为什么要这样做?

于 2013-05-03T12:32:55.797 回答
0

您可以使用面向对象的方法。

创建您自己的类来实现您的数学系统所需的方法。使用此类而不是浮点数。在它里面可以使用任何你想要的 float、double 或 BigDecimal。您可以稍后更改班级的工作方式,而无需更改系统的其余部分。

看看Double,它将给出如何构建它的总体思路。

实现加法、乘法等方法。

例如:

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,你只需要改变这个类。

于 2013-05-03T12:54:24.980 回答
0

实际上建议使用 BigDecimal 而不是 float/double。不要以为java有类似于typedef float real的东西

于 2013-05-03T12:31:22.267 回答
0

不,没有办法在 Java 中使用原始类型来实现这一点。根本没有 typedef 等价物,也没有模板类。从功能的角度来看,您可以使用面向对象的方式来处理它,这些方法将采用包装类/接口类型(类似于 java.lang.Number),并且还将结果作为包装类型返回。

但是,我会放弃整个想法,只实现双重版本。想要使用 float 的调用者可以使用任何方法的 double 版本 - 参数将自动扩展为 double。然后,调用者需要将结果转换回浮动。与 double 之间的转换将花费一点速度。或者如果 double 很好,你可以使用 float,只创建一个 float 版本。

就原始计算速度而言,浮点数和双精度数(在台式机 CPU 上)几乎没有区别。浮点的速度优势通常主要来自减半的内存带宽需求。

如果它只有一个或几个实用程序类,您还可以有两组(例如 FloatMathUtil 和 DoubleMathUtil)。然后由用户决定针对哪一个进行编码(就 API 而言,它们将是完全不相关的类)。

于 2013-05-03T17:58:46.780 回答