Skip to content

Commit 51b955c

Browse files
Use GGG incorect rounding formula (#177)
1 parent 1af4148 commit 51b955c

File tree

2 files changed

+55
-53
lines changed

2 files changed

+55
-53
lines changed

src/Modules/Common.lua

Lines changed: 54 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -261,12 +261,12 @@ end
261261

262262
-- Convert int to 4 bytes string
263263
function intToBytes(int)
264-
return string.char(
265-
bit.band(int, 0xFF),
266-
bit.band(bit.rshift(int, 8), 0xFF),
267-
bit.band(bit.rshift(int, 16), 0xFF),
268-
bit.band(bit.rshift(int, 24), 0xFF)
269-
)
264+
return string.char(
265+
bit.band(int, 0xFF),
266+
bit.band(bit.rshift(int, 8), 0xFF),
267+
bit.band(bit.rshift(int, 16), 0xFF),
268+
bit.band(bit.rshift(int, 24), 0xFF)
269+
)
270270
end
271271

272272
do
@@ -627,7 +627,7 @@ function naturalSortCompare(a, b)
627627
end
628628
end
629629

630-
-- Rounds a number to the nearest <dec> decimal places
630+
-- Rounds a number to the nearest <dec> decimal places 2.5->3 and -2.5->-2
631631
function round(val, dec)
632632
if dec then
633633
return m_floor(val * 10 ^ dec + 0.5) / 10 ^ dec
@@ -651,56 +651,58 @@ end
651651

652652
-- Symmetric round with precision: Rounds towards zero to <dec> decimal places.
653653
function roundSymmetric(val, dec)
654-
if dec then
655-
local factor = 10 ^ dec
656-
if val >= 0 then
657-
return m_floor(val * factor + 0.5) / factor
658-
else
659-
return m_ceil(val * factor - 0.5) / factor
660-
end
661-
else
662-
if val >= 0 then
663-
return m_floor(val + 0.5)
664-
else
665-
return m_ceil(val - 0.5)
666-
end
667-
end
654+
if dec then
655+
local factor = 10 ^ dec
656+
if val >= 0 then
657+
return m_floor(val * factor + 0.5) / factor
658+
else
659+
return m_ceil(val * factor - 0.5) / factor
660+
end
661+
else
662+
if val >= 0 then
663+
return m_floor(val + 0.5)
664+
else
665+
return m_ceil(val - 0.5)
666+
end
667+
end
668+
end
669+
670+
-- Use rounding formula for postive numbers always used in corrupted unique roll ranges this is an incorrect way to round numbers.
671+
function alwaysPositveRound(val, dec)
672+
if dec then
673+
local factor = 10 ^ dec
674+
return m_floor(val * factor + 0.5) / factor
675+
else
676+
return m_floor(val + 0.5)
677+
end
668678
end
669679

670680
-- Symmetric floor with precision: Rounds down towards zero to <dec> decimal places.
671681
function floorSymmetric(val, dec)
672-
if dec then
673-
local factor = 10 ^ dec
674-
if val >= 0 then
675-
return m_floor(val * factor) / factor
676-
else
677-
return m_ceil(val * factor) / factor
678-
end
679-
else
680-
if val >= 0 then
681-
return m_floor(val)
682-
else
683-
return m_ceil(val)
684-
end
685-
end
686-
end
687-
688-
-- Symmetric ceil with precision: Rounds up towards zero to <dec> decimal places.
682+
if dec then
683+
local factor = 10 ^ dec
684+
return select(1, math.modf(val * factor)) / factor
685+
else
686+
return select(1, math.modf(val))
687+
end
688+
end
689+
690+
-- Symmetric ceil with precision: Rounds up away from zero to <dec> decimal places.
689691
function ceilSymmetric(val, dec)
690-
if dec then
691-
local factor = 10 ^ dec
692-
if val >= 0 then
693-
return m_ceil(val * factor) / factor
694-
else
695-
return m_floor(val * factor) / factor
696-
end
697-
else
698-
if val >= 0 then
699-
return m_ceil(val)
700-
else
701-
return m_floor(val)
702-
end
703-
end
692+
if dec then
693+
local factor = 10 ^ dec
694+
if val >= 0 then
695+
return m_ceil(val * factor) / factor
696+
else
697+
return m_floor(val * factor) / factor
698+
end
699+
else
700+
if val >= 0 then
701+
return m_ceil(val)
702+
else
703+
return m_floor(val)
704+
end
705+
end
704706
end
705707

706708
---@param n number

src/Modules/ItemTools.lua

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ end
4444
-- ifRequired determines whether trailing zeros are displayed or not.
4545
function itemLib.formatValue(value, baseValueScalar, valueScalar, precision, displayPrecision, ifRequired)
4646
value = roundSymmetric(value * precision) -- resolve range to internal value
47-
if baseValueScalar and baseValueScalar ~= 1 then value = roundSymmetric(value * baseValueScalar) end -- apply corrupted mult
47+
if baseValueScalar and baseValueScalar ~= 1 then value = alwaysPositveRound(value * baseValueScalar) end -- apply corrupted mult
4848
if valueScalar and valueScalar ~= 1 then value = floorSymmetric(value * valueScalar) end -- apply modifier magnitude
4949
value = value / precision -- convert back to display space
5050
if displayPrecision then value = roundSymmetric(value, displayPrecision) end -- presentation

0 commit comments

Comments
 (0)