Java 0.0和1.0被认为是幻数吗?

Java 0.0和1.0被认为是幻数吗?,java,coding-style,floating-point,magic-numbers,Java,Coding Style,Floating Point,Magic Numbers,我知道-1、0、1和2是幻数规则的例外。然而,我想知道当它们是浮动时是否也是如此。我必须为它们初始化一个最终变量,还是可以直接在程序中使用它们 我在课堂上用它作为一个百分比。如果输入小于0.0或大于1.0,则我希望它自动将百分比设置为零。因此,如果(0.0这真的取决于上下文。避免使用幻数的关键是保持代码的可读性。请使用您的最佳判断,或者为我们提供一些上下文,以便我们可以使用我们的 幻数是具有无法解释的含义或多次出现的数值,可以(最好)用命名常量替换 编辑:何时使用变量名称记录代码与何时仅使用数

我知道
-1
0
1
2
是幻数规则的例外。然而,我想知道当它们是浮动时是否也是如此。我必须为它们初始化一个最终变量,还是可以直接在程序中使用它们


我在课堂上用它作为一个百分比。如果输入小于0.0或大于1.0,则我希望它自动将百分比设置为零。因此,如果(0.0这真的取决于上下文。避免使用幻数的关键是保持代码的可读性。请使用您的最佳判断,或者为我们提供一些上下文,以便我们可以使用我们的

幻数是具有无法解释的含义或多次出现的数值,可以(最好)用命名常量替换

编辑:何时使用变量名称记录代码与何时仅使用数字是一个激烈争论的话题。我的观点是上面链接的Wiki文章的作者的观点:如果含义不明显且在代码中多次出现,请使用命名常量。如果只出现一次,请对代码进行注释

如果你对其他人(强烈偏见)的观点感兴趣,请阅读

这实际上取决于上下文。避免使用幻数的关键在于保持代码的可读性。请使用您的最佳判断,或者为我们提供一些上下文,以便我们可以使用我们的

幻数是具有无法解释的含义或多次出现的数值,可以(最好)用命名常量替换

编辑:何时使用变量名称记录代码与何时仅使用数字是一个激烈争论的话题。我的观点是上面链接的Wiki文章的作者的观点:如果含义不明显且在代码中多次出现,请使用命名常量。如果只出现一次,请对代码进行注释

如果你对其他人(强烈偏见)的观点感兴趣,请阅读

通常,每个规则都有例外(这一条也是例外)。对这些常量使用一些助记名称是风格问题

例如:

int Rows = 2;
int Cols = 2;
这是一个非常有效的例子,使用原始值会产生误导


从上下文来看,幻数的含义应该是显而易见的。如果不是,就给它起个名字。

通常,每个规则都有例外(这一条也是例外)。对这些常量使用一些助记名称是风格问题

例如:

int Rows = 2;
int Cols = 2;
这是一个非常有效的例子,使用原始值会产生误导


从上下文来看,幻数的含义应该是显而易见的。如果不是,给这个东西起个名字。

这些数字并不是幻数规则的真正例外。常识规则(只要有“一”规则),当它没有简化到教条的水平时,基本上是,“不要在不明显的上下文中使用数字。”这四个数字在明显的上下文中非常常用。这并不意味着它们是唯一适用的数字,例如,如果我有:

long kilometersToMeters(int km) { return km * 1000L; }
命名数字真的没有意义:从微小的上下文中可以明显看出,它是一个转换因子。另一方面,如果我在一些低级代码中这样做:

sendCommandToDevice(1);
这仍然是错误的,因为这应该是一个常量
kResetCommand=1
或类似的值


因此,
0.0
1.0
是否应该被常数替换完全取决于上下文。

这些数字并不是神奇数字规则的真正例外。常识规则(只要有“一”规则),如果不简化到教条的水平,基本上是,“不要在没有明确含义的上下文中使用数字。“碰巧这四个数字在明显的上下文中非常常用。这并不意味着它们是唯一适用的数字,例如,如果我有:

long kilometersToMeters(int km) { return km * 1000L; }
命名数字真的没有意义:从微小的上下文中可以明显看出,它是一个转换因子。另一方面,如果我在一些低级代码中这样做:

sendCommandToDevice(1);
这仍然是错误的,因为这应该是一个常量
kResetCommand=1
或类似的值


因此,是否应将
0.0
1.0
替换为常数完全取决于上下文。

为某物附加名称会创建一个标识。给定定义

const double Moe = 2.0;
const double Joe = 2.0;
...
double Larry = Moe;
double Harry = Moe;
double Garry = Joe;
Moe和Joe的符号表示Larry和Harry的默认值与Garry的默认值不相关。决定是否为特定常量定义名称不应取决于该常量的值,而应取决于该常量是否会非巧合地显示为倍数e在代码中的位置。如果与远程设备通信时需要向其发送特定字节值以触发重置,我会考虑:

void ResetDevice()
{
  // The 0xF9 command is described in the REMOTE_RESET section of the
  // Frobnitz 9000 manual
  transmitByte(0xF9);
}
... elsewhere
myDevice.ResetDevice();
...
otherDevice.ResetDevice();
在许多情况下优于

// The 0xF9 command is described in the REMOTE_RESET section of the
// Frobnitz 9000 manual
const int FrobnitzResetCode = 0xF9;
... elsewhere
myDevice.transmitByte(FrobnitzResetCode );
...
otherDevice.transmitByte(FrobnitzResetCode );
值0xF9在重置Frobnitz 9000设备的上下文之外没有实际意义。除非外部代码出于某种原因宁愿发送必要的值本身而不是调用ResetDevice方法,否则该常量对该方法之外的任何代码都不应有任何值。虽然可以使用

void ResetDevice()
{
  // The 0xF9 command is described in the REMOTE_RESET section of the
  // Frobnitz 9000 manual
  int FrobnitzResetCode = 0xF9;
  transmitByte(FrobnitzResetCode);
}
在如此狭隘的背景下,为某事物定义一个名称真的没有多大意义

0和1等值的唯一“特殊”之处在于,在使用它们的上下文之外没有特定于域的标识的情况下,它们的使用频率明显高于其他常量,例如23。如果使用的函数要求第一个参数指示附加参数的数量(在C中有点常见)最好说:

output_multiple_strings(4, "Bob", Joe, Larry, "Fred"); // There are 4 arguments
...
output_multiple_strings(4, "George", Fred, "James", Lucy);  // There are 4 arguments
#定义\u字符串的数量\u 4//