【问题标题】:Java. Idiosyncratic output from modulo operator爪哇。模运算符的特殊输出
【发布时间】:2012-10-10 16:00:12
【问题描述】:

我明白了:

35%10 返回5

但是,为什么000000035%10 返回9

Ruby 做同样的事情。我检查了irb。

我应该去掉填充数字的 0 吗?这样做的 java 函数是什么?

【问题讨论】:

  • 因为它是十进制的 29 的八进制。
  • 我在这个变量中有一些整数,它们以这样的零开头,而其他的则不是。它们都是十进制整数,不应该是八进制的。如何确保每个整数都被视为十进制?
  • 您需要八进制数字 (0..7) 来生成八进制文字。

标签: java


【解决方案1】:

当您将前导零加上八进制数字(从07)时,您正在创建一个octal literal。由于八进制的000000035 是十进制的29,它与10 的余数是9

更新

如果字符串中有“八进制文字”,只需使用 Integer.parseInt 即可将其解析为十进制。

assert Integer.parseInt("035") == 35;

【讨论】:

  • 我明白了。谢谢你。但我希望我拥有的任何整数,例如“000030”或“000123”在我处理它之前都没有零。我怎样才能做到这一点?
  • 只是不要使用前导零。
  • 整数是从非常基本的 OCR 代码生成的。这意味着有时生成的数字有前导零。这就是现在的样子。
  • stackoverflow.com/questions/2800739/… 这个问题展示了如何使用正则表达式来删除它们。
  • 您可以简单地使用Integer.parseInt。默认情况下,它解析小数。
【解决方案2】:

数字文字中的前导零表示八进制数。

000000035 = 035 = 3*8 + 5 = 29
29 % 10 = 9

有关其他可用格式,请参阅 this page

【讨论】:

  • 这很奇怪,为什么要这么做?
  • 有时以接近内部 CPU 表示的格式指定常量很方便。
  • 是的,我想我的意思是为什么它与二进制文件中的 0b00035 或十六进制的 0x00035 不同?这似乎是避免此类混淆的更好系统。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-01
  • 1970-01-01
  • 2017-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多