是否可以使用某种构造来用双精度(或相反)替换所有浮点数而不进行重构?
例如,您可能正在实现一些可以与浮点数或双精度数完美互换的数学系统。在 C 中,您可以使用:typedef float real
,然后real
在您的代码中使用。更改为 double 只需替换一行代码。
在 Java 中这样的事情可能吗?还是有一些通用的数字类型?
在您描述的简单情况下,这在 Java 中是不可能的。但是,根据您的代码的工作方式,您可以将数学类写入接口,并使用双精度和浮点返回类型来实现所有返回值的方法。然后,您可以编写两个实现类,并根据您要使用的类在它们之间切换。
这似乎有点矫枉过正。你为什么要这样做?
您可以使用面向对象的方法。
创建您自己的类来实现您的数学系统所需的方法。使用此类而不是浮点数。在它里面可以使用任何你想要的 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,你只需要改变这个类。
实际上建议使用 BigDecimal 而不是 float/double。不要以为java有类似于typedef float real的东西
不,没有办法在 Java 中使用原始类型来实现这一点。根本没有 typedef 等价物,也没有模板类。从功能的角度来看,您可以使用面向对象的方式来处理它,这些方法将采用包装类/接口类型(类似于 java.lang.Number),并且还将结果作为包装类型返回。
但是,我会放弃整个想法,只实现双重版本。想要使用 float 的调用者可以使用任何方法的 double 版本 - 参数将自动扩展为 double。然后,调用者需要将结果转换回浮动。与 double 之间的转换将花费一点速度。或者如果 double 很好,你可以使用 float,只创建一个 float 版本。
就原始计算速度而言,浮点数和双精度数(在台式机 CPU 上)几乎没有区别。浮点的速度优势通常主要来自减半的内存带宽需求。
如果它只有一个或几个实用程序类,您还可以有两组(例如 FloatMathUtil 和 DoubleMathUtil)。然后由用户决定针对哪一个进行编码(就 API 而言,它们将是完全不相关的类)。