diff options
author | Winfried Donkers <winfrieddonkers@libreoffice.org> | 2018-07-19 12:05:14 +0200 |
---|---|---|
committer | Eike Rathke <erack@redhat.com> | 2018-07-19 14:01:30 +0200 |
commit | c69e7266916ac1b8917477fb4eccdb9098da5792 (patch) | |
tree | 2cbfb1c40fec024a35eb784fc90da9c664672a27 | |
parent | ad1fb1c3dfb04e956d8793a320714c1ae1ba5941 (diff) |
tdf#118800 fix rounding error in Calc function HOUR, MINUTE, SECOND.
Change-Id: I7a875b172493112b66fca8f70d2061371a05486c
Reviewed-on: https://gerrit.libreoffice.org/57721
Tested-by: Jenkins
Reviewed-by: Eike Rathke <erack@redhat.com>
-rw-r--r-- | sc/qa/unit/data/functions/date_time/fods/hour.fods | 31 | ||||
-rw-r--r-- | sc/qa/unit/data/functions/date_time/fods/minute.fods | 26 | ||||
-rw-r--r-- | sc/qa/unit/data/functions/date_time/fods/second.fods | 26 | ||||
-rw-r--r-- | sc/source/core/tool/interpr2.cxx | 6 |
4 files changed, 74 insertions, 15 deletions
diff --git a/sc/qa/unit/data/functions/date_time/fods/hour.fods b/sc/qa/unit/data/functions/date_time/fods/hour.fods index 847632a9750a..bb5abc52ab4e 100644 --- a/sc/qa/unit/data/functions/date_time/fods/hour.fods +++ b/sc/qa/unit/data/functions/date_time/fods/hour.fods @@ -154,8 +154,8 @@ Function basISODateTime(dVal#) basISODateTime = format(year(dt),"0000")&"-"& format(Month(dt),"00")&"-"& format(day(dt),"00")&" "& format(Hour(dt),"00")&":"& format(Minute(dt),"00")&":"& format(Second(dt),"00") End Function - - + + </ooo:source-code> </ooo:module> </ooo:library-embedded> @@ -1755,11 +1755,26 @@ End Function <table:table-cell table:number-columns-repeated="4"/> </table:table-row> <table:table-row table:style-name="ro2"> - <table:table-cell table:number-columns-repeated="2"/> - <table:table-cell table:style-name="ce32"/> - <table:table-cell table:style-name="ce21"/> - <table:table-cell table:number-columns-repeated="5"/> - <table:table-cell table:style-name="ce36" table:number-columns-repeated="5"/> + <table:table-cell table:formula="of:=HOUR([.J10])" office:value-type="float" office:value="10" calcext:value-type="float"> + <text:p>10</text:p> + </table:table-cell> + <table:table-cell office:value-type="float" office:value="10" calcext:value-type="float"> + <text:p>10</text:p> + </table:table-cell> + <table:table-cell table:style-name="ce32" table:formula="of:=[.A10]=[.B10]" office:value-type="boolean" office:boolean-value="true" calcext:value-type="boolean"> + <text:p>TRUE</text:p> + </table:table-cell> + <table:table-cell table:style-name="ce32" table:formula="of:=FORMULA([.A10])" office:value-type="string" office:string-value="=HOUR(J10)" calcext:value-type="string"> + <text:p>=HOUR(J10)</text:p> + </table:table-cell> + <table:table-cell office:value-type="string" calcext:value-type="string"> + <text:p>tdf11880</text:p> + </table:table-cell> + <table:table-cell table:number-columns-repeated="4"/> + <table:table-cell table:style-name="ce39" office:value-type="time" office:time-value="PT10H59M59.6S" calcext:value-type="time"> + <text:p>10:59:59.60</text:p> + </table:table-cell> + <table:table-cell table:style-name="ce36" table:number-columns-repeated="4"/> </table:table-row> <table:table-row table:style-name="ro2"> <table:table-cell table:number-columns-repeated="2"/> @@ -2432,4 +2447,4 @@ End Function </table:named-expressions> </office:spreadsheet> </office:body> -</office:document>
\ No newline at end of file +</office:document> diff --git a/sc/qa/unit/data/functions/date_time/fods/minute.fods b/sc/qa/unit/data/functions/date_time/fods/minute.fods index d27ec1ef5031..69fba0187454 100644 --- a/sc/qa/unit/data/functions/date_time/fods/minute.fods +++ b/sc/qa/unit/data/functions/date_time/fods/minute.fods @@ -896,7 +896,29 @@ </table:table-cell> <table:table-cell table:number-columns-repeated="5"/> </table:table-row> - <table:table-row table:style-name="ro2" table:number-rows-repeated="3"> + <table:table-row table:style-name="ro2"> + <table:table-cell table:formula="of:=MINUTE([.J9])" office:value-type="float" office:value="11" calcext:value-type="float"> + <text:p>11</text:p> + </table:table-cell> + <table:table-cell office:value-type="float" office:value="11" calcext:value-type="float"> + <text:p>11</text:p> + </table:table-cell> + <table:table-cell table:style-name="ce27" table:formula="of:=[.A9]=[.B9]" office:value-type="boolean" office:boolean-value="true" calcext:value-type="boolean"> + <text:p>TRUE</text:p> + </table:table-cell> + <table:table-cell table:style-name="ce35" table:formula="of:=FORMULA([.A9])" office:value-type="string" office:string-value="=MINUTE(J9)" calcext:value-type="string"> + <text:p>=MINUTE(J9)</text:p> + </table:table-cell> + <table:table-cell office:value-type="string" calcext:value-type="string"> + <text:p>tdf11880</text:p> + </table:table-cell> + <table:table-cell table:number-columns-repeated="4"/> + <table:table-cell table:style-name="ce39" office:value-type="time" office:time-value="PT10H11M59.6S" calcext:value-type="time"> + <text:p>10:11:59.60</text:p> + </table:table-cell> + <table:table-cell table:number-columns-repeated="5"/> + </table:table-row> + <table:table-row table:style-name="ro2" table:number-rows-repeated="2"> <table:table-cell table:number-columns-repeated="2"/> <table:table-cell table:style-name="ce40"/> <table:table-cell table:number-columns-repeated="12"/> @@ -1105,4 +1127,4 @@ </table:named-expressions> </office:spreadsheet> </office:body> -</office:document>
\ No newline at end of file +</office:document> diff --git a/sc/qa/unit/data/functions/date_time/fods/second.fods b/sc/qa/unit/data/functions/date_time/fods/second.fods index e6d2b46946e5..8db288ae3ae9 100644 --- a/sc/qa/unit/data/functions/date_time/fods/second.fods +++ b/sc/qa/unit/data/functions/date_time/fods/second.fods @@ -825,7 +825,29 @@ </table:table-cell> <table:table-cell table:number-columns-repeated="5"/> </table:table-row> - <table:table-row table:style-name="ro2" table:number-rows-repeated="3"> + <table:table-row table:style-name="ro2"> + <table:table-cell table:formula="of:=SECOND([.J9])" office:value-type="float" office:value="12" calcext:value-type="float"> + <text:p>12</text:p> + </table:table-cell> + <table:table-cell office:value-type="float" office:value="12" calcext:value-type="float"> + <text:p>12</text:p> + </table:table-cell> + <table:table-cell table:style-name="ce38" table:formula="of:=[.A9]=[.B9]" office:value-type="boolean" office:boolean-value="true" calcext:value-type="boolean"> + <text:p>TRUE</text:p> + </table:table-cell> + <table:table-cell table:style-name="ce11" table:formula="of:=FORMULA([.A9])" office:value-type="string" office:string-value="=SECOND(J9)" calcext:value-type="string"> + <text:p>=SECOND(J9)</text:p> + </table:table-cell> + <table:table-cell office:value-type="string" calcext:value-type="string"> + <text:p>tdf11880</text:p> + </table:table-cell> + <table:table-cell table:number-columns-repeated="4"/> + <table:table-cell table:style-name="ce45" office:value-type="time" office:time-value="PT10H11M12.6S" calcext:value-type="time"> + <text:p>10:11:12.60</text:p> + </table:table-cell> + <table:table-cell table:number-columns-repeated="5"/> + </table:table-row> + <table:table-row table:style-name="ro2" table:number-rows-repeated="2"> <table:table-cell table:number-columns-repeated="2"/> <table:table-cell table:style-name="ce16"/> <table:table-cell table:number-columns-repeated="12"/> @@ -1034,4 +1056,4 @@ </table:named-expressions> </office:spreadsheet> </office:body> -</office:document>
\ No newline at end of file +</office:document> diff --git a/sc/source/core/tool/interpr2.cxx b/sc/source/core/tool/interpr2.cxx index 299fecb359f3..e055324fa679 100644 --- a/sc/source/core/tool/interpr2.cxx +++ b/sc/source/core/tool/interpr2.cxx @@ -146,7 +146,7 @@ void ScInterpreter::ScGetMin() { double fTime = GetDouble(); fTime -= ::rtl::math::approxFloor(fTime); // date part absent - long nVal = static_cast<long>(::rtl::math::approxFloor(fTime*DATE_TIME_FACTOR+0.5)) % ::tools::Time::secondPerHour; + long nVal = static_cast<long>(::rtl::math::approxFloor(fTime*DATE_TIME_FACTOR)) % ::tools::Time::secondPerHour; PushDouble( static_cast<double>(nVal / ::tools::Time::secondPerMinute) ); } @@ -154,7 +154,7 @@ void ScInterpreter::ScGetSec() { double fTime = GetDouble(); fTime -= ::rtl::math::approxFloor(fTime); // date part absent - long nVal = static_cast<long>(::rtl::math::approxFloor(fTime*DATE_TIME_FACTOR+0.5)) % ::tools::Time::secondPerMinute; + long nVal = static_cast<long>(::rtl::math::approxFloor(fTime*DATE_TIME_FACTOR)) % ::tools::Time::secondPerMinute; PushDouble( static_cast<double>(nVal) ); } @@ -162,7 +162,7 @@ void ScInterpreter::ScGetHour() { double fTime = GetDouble(); fTime -= ::rtl::math::approxFloor(fTime); // date part absent - long nVal = static_cast<long>(::rtl::math::approxFloor(fTime*DATE_TIME_FACTOR+0.5)) / ::tools::Time::secondPerHour; + long nVal = static_cast<long>(::rtl::math::approxFloor(fTime*DATE_TIME_FACTOR)) / ::tools::Time::secondPerHour; PushDouble(static_cast<double>(nVal)); } |