Merge pull request #3324 from isaacl/bigDecimalTruncates

Use BigDecimal for json precision
pull/3323/merge
Thibault Duplessis 2017-07-22 18:41:42 +02:00 committed by GitHub
commit 44e742dd63
6 changed files with 14 additions and 18 deletions

@ -1 +1 @@
Subproject commit 046e2ff215754193195e28a0cdd1d03c33b3ab52
Subproject commit 4432570caf88593709371a85671c465d3b8268a5

View File

@ -32,9 +32,8 @@ object Maths {
else n toDouble upper.head
}
def truncateAt(n: Double, p: Int): Double = {
val s = math.pow(10, p)
(math floor n * s) / s
def roundAt(n: Double, p: Int): BigDecimal = {
BigDecimal(n).setScale(p, BigDecimal.RoundingMode.HALF_UP)
}
def toInt(l: Long): Int = l.min(Int.MaxValue).max(Int.MinValue).toInt

View File

@ -8,7 +8,6 @@ import chess.variant.Crazyhouse
import chess.{ Centis, PromotableRole, Pos, Color, Situation, Move => ChessMove, Drop => ChessDrop, Clock => ChessClock, Status }
import JsonView._
import lila.chat.{ UserLine, PlayerLine }
import lila.common.Maths.truncateAt
sealed trait Event {
def typ: String
@ -264,20 +263,19 @@ object Event {
sealed trait ClockEvent extends Event
case class Clock(white: Float, black: Float, nextLagComp: Option[Centis] = None) extends ClockEvent {
case class Clock(white: Centis, black: Centis, nextLagComp: Option[Centis] = None) extends ClockEvent {
def typ = "clock"
def data = Json.obj(
"white" -> truncateAt(white, 2),
"black" -> truncateAt(black, 2)
"white" -> white.toSeconds,
"black" -> black.toSeconds
).add("lag" -> nextLagComp.collect { case Centis(c) if c > 1 => c })
}
object Clock {
def apply(clock: ChessClock): Clock = Clock(
clock remainingTime Color.White toSeconds,
clock remainingTime Color.Black toSeconds,
clock remainingTime Color.White,
clock remainingTime Color.Black,
clock lagCompEstimate clock.color
)
def tenths(white: Int, black: Int): Clock = Clock(white.toFloat / 10, black.toFloat / 10)
}
case class Berserk(color: Color) extends Event {

View File

@ -80,7 +80,6 @@ object JsonView {
}
implicit val clockWriter: OWrites[Clock] = OWrites { c =>
import lila.common.Maths.truncateAt
Json.obj(
"running" -> c.isRunning,
"initial" -> c.limitSeconds,

View File

@ -51,7 +51,7 @@ final class JsonView(getLightUser: LightUser.GetterSync) {
object JsonView {
private def truncate(v: Double, depth: Int = 2) = lila.common.Maths.truncateAt(v, depth)
private def round(v: Double, depth: Int = 2) = lila.common.Maths.roundAt(v, depth)
private val isoFormatter = ISODateTimeFormat.dateTime
private implicit val dateWriter: Writes[DateTime] = Writes { d =>
@ -62,9 +62,9 @@ object JsonView {
}
implicit val glickoWriter: OWrites[Glicko] = OWrites { p =>
Json.obj(
"rating" -> truncate(p.rating),
"deviation" -> truncate(p.deviation),
"volatility" -> truncate(p.volatility, 3),
"rating" -> round(p.rating),
"deviation" -> round(p.deviation),
"volatility" -> round(p.volatility, 3),
"provisional" -> p.provisional
)
}
@ -72,7 +72,7 @@ object JsonView {
Json.obj("glicko" -> p.glicko, "nb" -> p.nb, "progress" -> p.progress)
}
private implicit val avgWriter: Writes[Avg] = Writes { a =>
JsNumber(truncate(a.avg))
JsNumber(round(a.avg))
}
implicit val perfTypeWriter: OWrites[PerfType] = OWrites { pt =>
Json.obj(

View File

@ -50,7 +50,7 @@ final class SlackApi(
if (event.username == "Anonymous") "Anonymous"
else s"lichess.org/@/${event.username}"
private def amount(cents: Int) = s"$$${lila.common.Maths.truncateAt(cents / 100d, 2)}"
private def amount(cents: Int) = s"$$${BigDecimal(cents, 2)}"
}
def publishEvent(event: Event): Funit = event match {