0

我将Float对象字段转换为 json。并且值由 Argonaut0.6转换为。0.6000000238418579如何纠正它?

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

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)

控制台输出:

#1
0.6
#2
{"name":0.6000000238418579}
4

2 回答 2

2

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

scala> val a = 0.6f
a: Float = 0.6

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

为了确保它不会发生,您可以在添加到 JSON 之前格式化您的浮点数

def PersonEncodeJson: EncodeJson[Person] = EncodeJson((p: Person) => ("name" := "%1.1f" format p.name) ->: jEmptyObject)
于 2015-08-26T08:33:30.930 回答
2

你必须使用Float吗?由于您关心确切的值,因此它似乎不合适。

改为使用示例BigDecimal

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课程,则可以将 to 转换FloatString然后 to BigDecimal

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}
于 2015-08-26T08:51:22.610 回答