奇怪的转换加倍到int

时间:2015-08-25 14:05:19

标签: java swift integer double

我最近在将Double转换为Int时在ios swift中提出了一个小问题。

var myDoubleValue: Double = 10.2
var newInt = Int(myDoubleValue * 100) //1019

在那里我将10.2乘以100并且没有得到预期值(1020)而是1019 ......

但在大多数情况下工作正确如下

var myDoubleValue: Double = 10.3
var newInt = Int(myDoubleValue * 100) //1030

我还用Java进一步测试了它,同样的问题也在那里。

double myDoubleValue = 10.2;
int myIntValue1 = (int)(myDoubleValue * 100); //1019

我可以通过在转换为Int之前执行'round'来解决这个问题,如下所示......

var myDoubleValue: Double = 10.2
var newInt = Int(round(myDoubleValue * 100)) //1020

但如果该值具有如下三位小数,那么这就是我不想要的东西,因为它在那时是四舍五入(10.206 ---> 1021)

4 个答案:

答案 0 :(得分:2)

这是向上/截断错误的结果。实际上,

2015-08-27 12:04:11.312  INFO 5780 --- [           main] o.s.b.f.s.DefaultListableBeanFactory     :
Overriding bean definition for bean 'scriptFactory.foobar0': replacing [Generic bean: class [null];
scope=; abstract=false; lazyInit=false; autowireMode=0; dependencyCheck=0; autowireCandidate=true; p
rimary=false; factoryBeanName=null; factoryMethodName=null; initMethodName=null; destroyMethodName=n
ull] with [Generic bean: class [null]; scope=; abstract=false; lazyInit=false; autowireMode=0; depen
dencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=null; i
nitMethodName=null; destroyMethodName=null]

就像是

  myDoubleValue = 10.2 

所以

  myDoubleValue = 10.1999999999999

修剪 myDoubleValue * 100 = 1019.999999999 之后,你有int。更好的做法是向上舍入而不是 trim

1019

答案 1 :(得分:2)

显示的值就是,它不是整个值,使用格式来查看更多数字。 10.2或10.3不能用base2浮点数精确表示,因此结果可能与预期的略有不同。

以下示例显示了正在发生的事情:

Administrator->Login
Vendor->Login
Proprietary->Login
etc...

请注意,10.2将转换为浮动点Double,稍微 10.2以下,并且将被截断。

请注意,10.3转换为浮动点Double,略高于高于 10.3,而将被截断。

如果需要精确的十进制数学运算,例如在计算器中或处理金钱时,请使用var myDoubleValue1: Double = 10.2 print(String(format: "myDoubleValue1: %.17f", myDoubleValue1)) // myDoubleValue1: 10.19999999999999929 var myDoubleValue2: Double = 10.3 print(String(format: "myDoubleValue2: %.17f", myDoubleValue2)) // myDoubleValue2: 10.30000000000000071

答案 2 :(得分:1)

Java回答

这是因为doublefloat类型和包装器在操作时不保证精确值。

在Java中,您正在寻找的推荐用语是:

BigDecimal myDoubleValue = new BigDecimal("10.2");
int myInt = myDoubleValue.multiply(new BigDecimal("100")).intValue();
System.out.println(myInt);

<强>输出

1020

答案 3 :(得分:0)

看起来你想要收集少量错误,但是你想要向下舍入其他错误。

你可以这样做

double d = 10.199999;
long l = (long) (d * 100 + 0.01); // l = 10.20

double d = 10.206;
long l = (long) (d * 100 + 0.01); // l = 10.20