当前位置: 首页 > 面试题库 >

为什么Java的部门破裂了?

南门承教
2023-03-14
问题内容

我是一个经验丰富的php开发人员,刚开始学习Java。我目前正在学习Lynda的一些课程,但我仍处于初期阶段。我正在编写要求用户输入并进行简单计算和操作的示例html" target="_blank">程序。

昨天我遇到了这种情况:

double result = 1 / 2;

用我的穴居人的大脑,我会思考result == 0.5,但不是,不是Java。明显地1 / 2 == 0.0。是的,我知道如果将其中一个操作数更改为双精度,结果也将是双精度。

这实际上吓到我了。我禁不住认为这是很糟糕的。认为整数除法会导致整数是非常幼稚的。我认为情况很少。

但是,由于Java的使用非常广泛,并且正在搜索“为什么Java的划分被破坏了?”。没有产生任何结果,我可能是错误的。

我的问题是:

  1. 为什么除法会像这样?
  2. 我还能在哪里找到这样的魔术/巫毒/意外行为?

问题答案:

您正在像一个PHP开发人员那样思考;PHP是动态类型的语言。这意味着类型是在运行时推导的,因此小数不能在逻辑上产生整数,因此从除法运算中隐含一个double(或float)。

Java,C,C
++,C#和许多其他语言都是强类型化语言,因此,当将整数除以整数时,您会得到一个整数,100/50将其还给我2,就像100/45给我一样2,因为100/45实际上是2.2222...,将十进制截断以获得一个整数(整数除法),您得到2

在强类型语言中,如果要使结果符合预期,则需要显式(或隐式),这就是为什么在除法运算中将参数之一设为double或float会导致浮点除法(可返回分数)。

因此,在Java中,您可以执行以下任一操作来获取小数:

double result = 1.0 / 2;
double result = 1f / 2;
double result = (float)1 / 2;

从松散类型的动态语言到强类型的静态语言可能会令人讨厌,但不必担心。只是要了解,除了输入之外,您还必须格外小心进行验证,还必须验证类型。

从PHP到Java,您应该知道您 不能 做这样的事情:

$result = "2.0";
$result = "1.0" / $result;
echo $result * 3;

在PHP中,这会产生输出1.5(因为(1/2)*3 == 1.5),但是在Java中,

String result = "2.0";
result = "1.0" / result;
System.out.println(result * 1.5);

这将导致错误,因为您不能分割字符串(不是数字)。

希望能对您有所帮助。



 类似资料:
  • 我有一个非常奇怪的问题,我希望你的眼睛能帮助解决它。 我定义了一个函数,它通过BASH连接到Oracle SQL数据库。连接后,我使用一个herdeoc传入一个简单的select语句,该语句查找最大订阅id并递增它,具体取决于函数被调用的次数。代码如下: 在命令行调用函数时,上述代码非常有效: 但是,当函数通过管道传输到AWK语句时,函数不再抖动,这毫无意义!请参阅下面的输出: 我不明白。哈哈,我

  • 问题内容: 我怀疑方法局部变量仅在方法执行时有效。同样,当或块溢出时(次要/主要GC)等触发GC。因此,如果方法主体末尾没有溢出怎么办,那么就无需触发GC。尽管不触发主要/次要GC,我们仍将销毁所有局部变量。怎么做? 问题答案: 垃圾收集器- 有时称为“收割者”-按自己的时间表运行,并收集不参考的对象。当然,方法退出后就无法引用局部变量,因为它们超出了范围,因此它们对于您的程序来说是死的*,但是它

  • 问题内容: 我有以下代码行: 我希望看到的结果是0.555,但是它将打印出零。有人可以帮我理解为什么会这样吗?我目前正在学习编程,并感谢您的帮助。 谢谢! 问题答案: 发生这种情况是因为您在不知不觉中正在执行Integer Division。为了使计算更快,计算机在不涉及十进制数的情况下使用整数除法,因此会丢失十进制值。 试试看: 要么 要么 要么 要么

  • 我正在对一个由zuul代理服务支持的简单Spring云应用程序进行一些压力测试。由于Zuul和服务之间的旧连接,我们偶尔会出现管道异常。我使用不同的配置选项配置Zuul,但没有成功: 例外情况如下: 通用域名格式。netflix。祖尔。例外ZuulException:组织转发错误。springframework。云netflix。祖尔。过滤器。路线RibbonRoutingFilter。转发(Ri

  • 问题内容: 我有以下python代码。 我得到以下日志打印输出。 如果我使用split(),btw代替split(’‘),则会得到相同的日志打印输出。 为什么split不将结果分成6个条目的列表?我想问题是涉及到http请求,因为我在gae交互式控制台中的测试获得了预期的结果。 问题答案: 不修改字符串。它返回拆分列表。如果要使用该列表,则需要使用来将其分配给某些内容。

  • 我们将我们的集群迁移到Cassandra 1.2(从1.1.7),并尝试在迁移后运行修复(我们按照建议定期运行它们)。 由于SSTable版本不同,修复失败,因此我们使用和并重试。 但是,修复失败了,但有这个例外: 我们还注意到,在死亡之前,< code>nodetool netstats显示了奇怪的统计数据(表传输为756845%...). 编辑 这似乎是压缩SSTables传输的问题,我将尝试