Argonaut.io 浮点数转换不正确
Incorrect Float conversion by Argonaut.io
我将对象的 Float
字段转换为 json。 Argonaut 将值 0.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}
处理浮点数时出现这种情况很正常。
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)
您必须使用 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
class,您可以将 Float
转换为 String
,然后再转换为 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}
我将对象的 Float
字段转换为 json。 Argonaut 将值 0.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}
处理浮点数时出现这种情况很正常。
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)
您必须使用 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
class,您可以将 Float
转换为 String
,然后再转换为 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}