首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Argonaut.io不正确的浮点转换

Argonaut.io不正确的浮点转换
EN

Stack Overflow用户
提问于 2015-08-26 06:47:24
回答 2查看 63关注 0票数 0

我将对象的Float字段转换为json。值0.6由Argonaut转换为0.6000000238418579。怎么改正呢?

检查这一点的简单测试用例:

代码语言:javascript
复制
import argonaut.Argonaut._
import argonaut.EncodeJson

class Person(val name: Float)
val person = new Person(0.6f)
println("#1")
println(person.name)
def PersonEncodeJson: EncodeJson[Person] =
  EncodeJson((p: Person) => ("name" := p.name) ->: jEmptyObject)
val json = person.asJson(PersonEncodeJson).nospaces
println("#2")
println(json)

控制台输出:

代码语言:javascript
复制
#1
0.6
#2
{"name":0.6000000238418579}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-08-26 08:51:22

你一定要使用Float吗?因为你关心的是确切的价值,这似乎不合适。

使用BigDecimal的示例:

代码语言:javascript
复制
import argonaut.Argonaut._
import argonaut.EncodeJson

class Person(val name: BigDecimal)
val person = new Person(BigDecimal("0.6"))

def PersonEncodeJson: EncodeJson[Person] =
  EncodeJson((p: Person) => ("name" := p.name) ->: jEmptyObject)

person.asJson(PersonEncodeJson).nospaces
// res0: String = {"name":0.6}

如果无法更改Person类,则可以将Float转换为String,然后转换为BigDecimal

代码语言:javascript
复制
import argonaut.Argonaut._
import argonaut.EncodeJson

class Person(val name: Float)
val person = new Person(0.6f)

def PersonEncodeJson: EncodeJson[Person] =
  EncodeJson((p: Person) =>
    ("name" := BigDecimal(p.name.toString)) ->: jEmptyObject)

person.asJson(PersonEncodeJson).nospaces
// res0: String = {"name":0.6}
票数 2
EN

Stack Overflow用户

发布于 2015-08-26 08:33:30

在处理浮标时,这种事情是很正常的。

代码语言:javascript
复制
scala> val a = 0.6f
a: Float = 0.6

scala> val b: Double = a
b: Double = 0.6000000238418579

为了确保不会发生这种情况,可以在添加到JSON之前格式化浮点数

代码语言:javascript
复制
def PersonEncodeJson: EncodeJson[Person] = EncodeJson((p: Person) => ("name" := "%1.1f" format p.name) ->: jEmptyObject)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32219726

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档