如何检查输入值是整数还是浮点数?
假设312/100 = 3.12,这里我需要检查3.12是浮点数还是整数.
实际上,我找到了可能的解决方案
//returns true
new BigDecimal("5.50").doubleValue() == new BigDecimal("5.5").doubleValue()
Run Code Online (Sandbox Code Playgroud)
当然,它可以通过类似的Math.abs (v1 - v2) < EPS方式进行改进,使比较更加健壮,但问题是这种技术是否可以接受或是否有更好的解决方案?
如果有人知道为什么java设计师决定以这种方式实现BigDecimal的平等,那么阅读它会很有趣.
我写了以下代码:
public class NewClass2 implements Comparator<Point>
{
public int compare(Point p1, Point p2)
{
return (int)(p1.getY() - p2.getY());
}
}
Run Code Online (Sandbox Code Playgroud)
如果我说有两个双号,3.2 - 3.1差异应该是0.1.然而,当我将数字转换为int时,差异最终为0,这是不正确的.
因此我需要compare()返回一个double,而不是int.问题是,我的getX领域是双重的.我怎么解决这个问题?
我需要在Java中进行一些浮点运算,如下面的代码所示:
public class TestMain {
private static Map<Integer, Double> ccc = new HashMap<Integer, Double>() {
{ put(1, 0.01); put(2, 0.02); put(3, 0.05); put(4, 0.1); put(6, 0.2);
put(10, 0.5); put(20, 1.0); put(30, 2.0); put(50, 5.0); put(100, 10.0);
}
};
Double increment(Double i, boolean up) {
Double inc = null;
while (inc == null) {
inc = ccc.get(i.intValue());
if (up)
--i;
else
++i;
}
return inc;
}
public static void main(String[] args) {
TestMain tt = new TestMain();
for (double i = …Run Code Online (Sandbox Code Playgroud) 请看以下两个代码:
public static void main(String... args)
{
System.out.println(0.5==0.5f);
}
Run Code Online (Sandbox Code Playgroud)
输出:true
public static void main(String... args)
{
System.out.println(0.1==0.1f);
}
Run Code Online (Sandbox Code Playgroud)
输出:false
为什么会这样?
在JBox2d中,存在以下代码Vec2.equals():
@Override
public boolean equals(Object obj) { //automatically generated by Eclipse
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Vec2 other = (Vec2) obj;
if (Float.floatToIntBits(x) != Float.floatToIntBits(other.x))
return false;
if (Float.floatToIntBits(y) != Float.floatToIntBits(other.y))
return false;
return true;
}
Run Code Online (Sandbox Code Playgroud)
我想知道float < - > int位转换函数的用途是什么,这里.这是否提供了一种解决Java浮动比较不准确问题的方法(如果可能的话)?还是完全不同的东西?我想知道它是否是epsilon方法的替代方案:
if (Math.abs(floatVal1 - floatVal2) < epsilon)
Run Code Online (Sandbox Code Playgroud)
PS.为了完整和兴趣,这里是Vec2.hashCode():
@Override
public int hashCode() { //automatically generated by Eclipse
final int prime = 31;
int …Run Code Online (Sandbox Code Playgroud) 在看到下面的代码片段的结果后,我对浮点数的行为感到困惑.
float var1 = 5.4f;
float var2 = 5.5f;
if(var1 == 5.4)
System.out.println("Matched");
else
System.out.println("Oops!!");
if(var2 == 5.5)
System.out.println("Matched");
else
System.out.println("Oops!!");
Run Code Online (Sandbox Code Playgroud)
输出:
Oops!!
Matched
Run Code Online (Sandbox Code Playgroud)
这是因为十进制数不能完全代表基本2二进制格式吗?或者这是因为我将float类型变量与double类型进行比较时的精度?如果是,那为什么它适用于下一个变量?
考虑到:
看起来像当前形式的Float.equals几乎完全没用.
我是否遗漏了某些东西,或者有时候使用Float.equals是合适的,除非你想要测试二进制相等的极其罕见的情况?
如果是这样,滚动你自己的identikit epsilon函数(如第一个链接中所推荐的那样)是否真的是完成的事情,或者是否存在这个令人难以置信的常见操作的现有包装器?
另外,Double/Float.compare是否会遇到同样的问题,或者是否存在需要epsilon的现有比较器?
(请注意,我无法将现有库从Floats更改为BigD)
比方说,我在Java或Python或C++编程的一个简单的问题,可能是建的阶乘的TCP/UDP echo服务或计算.我是否需要打扰架构细节,即它是32位还是64位?
恕我直言,除非我正在编写与相当低级别的东西相关的东西,否则我不必为32或64位而烦恼.我哪里错了?还是我正确的???
我已经将带有 gtest 测试的 c++ 项目移植到带有 nunit 测试的 ac# 项目。现在我遇到了浮点精度问题。
在 nunit 测试中我不太好(红色)
Assert.AreEqual(0.7, 7 * 0.1);
Run Code Online (Sandbox Code Playgroud)
在 gtest 测试中,我有:
ASSERT_DOUBLE_EQ(0.7, 7 * 0.1);
Run Code Online (Sandbox Code Playgroud)
没问题(绿色)
现在的问题是为什么???