07.01.2013, 19:09
|
Профессор
|
|
Регистрация: 14.03.2012
Сообщений: 1,808
|
|
Злые числа с плавающей точкой
Доброго времени суток!
Раньше не особо обращал внимание на эту проблему, а сейчас приспичило.
в общем вот в чем проблема:
Есть целое число, от него нужно всегда отнимать 0.1 когда происходит какое либо событие.
Допустим есть число 10. Когда происходит событие в первый раз джска отнимает 0.1 и получается 9.9 Но когда событие поворяется, js отнимает уже не 0.1 а 1, тоесть было 9.9 а стало 8.9 и т.д
Подскажите пожалуйста как с этим бороться
__________________
Научу себя плохому
|
|
07.01.2013, 19:28
|
|
Профессор
|
|
Регистрация: 26.03.2012
Сообщений: 823
|
|
Округляй числа до целого, выполняй действия с целыми числами, и снова приводи в дробное!
http://learn.javascript.ru/number#неточные-вычисления
Последний раз редактировалось dmitry111, 07.01.2013 в 19:38.
|
|
07.01.2013, 19:37
|
без статуса
|
|
Регистрация: 25.05.2012
Сообщений: 8,219
|
|
function Itog(i,N,Numb,Delta){
var a = parseFloat((Numb - i*Delta).toFixed(N));
return a;
}
var Delta=0.01; // Delta - Константа уменьшения
var Numb=10.0000000001;//Изначальное неизменяемое число
var N =3 // Max-число знаков после запятой
var i=7; // i - кол-во вычитаний из начального
alert(Itog(i,N,Numb,Delta))
Последний раз редактировалось Deff, 07.01.2013 в 20:44.
|
|
07.01.2013, 19:38
|
Профессор
|
|
Регистрация: 14.03.2012
Сообщений: 1,808
|
|
dmitry111,да я всегда так и делал, дело в том, что есть два инпута к каждому инпуту по 2 кнопки.
+ и -
В 1 инпуте и считаем и отправляем все в секундах тоесть как было 25 секунд или 40 секунд, так обработчику и отправляем.
А во 2 инпуте работа отображаться должна в 10 долях секунд (например 3.2 или 3.6), а отправлятся целым числом, например если было 3.6 то обработчику отправляем 36. Вобщем точка только для человека.
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<style type="text/css">
* {
margin:0;
padding:0;
}
body {
background:#393939;
color:#FFF;
}
form {
margin:50px 0 0;
}
label {
display:block;
float:left;
text-align:right;
width:140px;
padding:5px 10px 0 0;
}
input[type=text] {
float:left;
width:40px;
font:bold 20px Helvetica, sans-serif;
text-align:center;
padding:3px 0 0;
}
form div {
overflow:hidden;
margin:0 0 5px;
}
#submit {
border:1px solid #000;
background:#eee;
margin:15px 0 0 175px;
padding:5px 10px 3px;
}
#submit:hover {
background:#ccc;
}
.incdec li {
float:left;
width:30px;
height:25px;
background:#f7f7f7;
text-align:center;
padding-top:8px;
color:#000;
list-style:none;
margin-left:5px;
cursor:pointer;
border:1px solid #777;
}
.incdec li:active {
border:#000;
}
</style>
<script type="text/javascript">
function incDec(i) {
document.onmousedown = function(){return false}
if(i < 0) {
i = -i;
var valuE = parseInt(document.getElementById('valu'+i).value);
if(valuE-1 < 0) {}else{
document.getElementById('valu'+i).value = valuE - 1;
}
}
else {
var valuE = parseInt(document.getElementById('valu'+i).value);
document.getElementById('valu'+i).value = valuE + 1;
}
}
</script>
<form id="forms" method="post" action="">
<div>
<label for="name">включение</label>
<input type="text" id="valu1" value="2"/>
<ul class="incdec">
<li onclick="incDec(1)">+</li>
<li onclick="incDec(-1)">-</li>
</ul>
</div>
<div>
<label for="name">работа</label>
<input type="text" name="turtle-doves" id="valu2" value="2"/>
<ul class="incdec">
<li onclick="incDec(2)">+</li>
<li onclick="incDec(-2)">-</li>
</ul>
</div>
<input type="submit" value="Ok" id="submit" />
</form>
Зы
код писался в 4 утра, так что немного странноват)
__________________
Научу себя плохому
|
|
07.01.2013, 19:47
|
х.з
|
|
Регистрация: 21.11.2010
Сообщений: 4,588
|
|
Сообщение от l-liava-l
|
Есть целое число, от него нужно всегда отнимать 0.1 когда происходит какое либо событие.
Допустим есть число 10. Когда происходит событие в первый раз джска отнимает 0.1 и получается 9.9 Но когда событие поворяется, js отнимает уже не 0.1 а 1, тоесть было 9.9 а стало 8.9 и т.д
|
писать алгоритмы правильно, а не обвинять в своих ошибках язык
|
|
07.01.2013, 19:50
|
Профессор
|
|
Регистрация: 14.03.2012
Сообщений: 1,808
|
|
Цитата:
|
писать алгоритмы правильно, а не обвинять в своих ошибках язык
|
А кто его обвинял? я лишь интересуюсь как справиться с невзгодами)
__________________
Научу себя плохому
|
|
07.01.2013, 20:01
|
Профессор
|
|
Регистрация: 14.03.2012
Сообщений: 1,808
|
|
Deff, что то я косячу, получается тоже самое
__________________
Научу себя плохому
|
|
07.01.2013, 20:05
|
без статуса
|
|
Регистрация: 25.05.2012
Сообщений: 8,219
|
|
Сообщение от l-liava-l
|
Deff, что то я косячу, получается тоже самое
|
Поправил
|
|
07.01.2013, 20:45
|
Профессор
|
|
Регистрация: 14.03.2012
Сообщений: 1,808
|
|
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<style type="text/css">
* {
margin:0;
padding:0;
}
body {
background:#393939;
color:#FFF;
}
form {
margin:50px 0 0;
}
label {
display:block;
float:left;
text-align:right;
width:140px;
padding:5px 10px 0 0;
}
input[type=text] {
float:left;
width:40px;
font:bold 20px Helvetica, sans-serif;
text-align:center;
padding:3px 0 0;
}
form div {
overflow:hidden;
margin:0 0 5px;
}
#submit {
border:1px solid #000;
background:#eee;
margin:15px 0 0 175px;
padding:5px 10px 3px;
}
#submit:hover {
background:#ccc;
}
.incdec li {
float:left;
width:30px;
height:25px;
background:#f7f7f7;
text-align:center;
padding-top:8px;
color:#000;
list-style:none;
margin-left:5px;
cursor:pointer;
border:1px solid #777;
}
.incdec li:active {
border:#000;
}
</style>
<script type="text/javascript">
function incDec(i) {
document.onmousedown = function(){return false}
if(i < 0) {
i = -i;
var valuE = parseInt(document.getElementById('valu'+i).value);
if('valu'+i == 'valu2') {
/////////////////////////
function Itog(y,N,Numb,Delta){
var a = parseFloat((Numb - y*Delta).toFixed(N));
return a;
}
var Numb=valuE+0.0000000001;
var Delta=0.01;
var y=0;
var N =3;
alert(Numb +'- это numb');
alert(Itog(1,N,Numb,Delta) + '- это результат');
document.getElementById('valu'+i).value = Itog(1,N,Numb,Delta);
///////////////////////////////////////////////////
}
if(valuE-1 < 0) {}else{
//document.getElementById('valu'+i).value = valuE - 1;
}
}
else {
var valuE = parseInt(document.getElementById('valu'+i).value);
document.getElementById('valu'+i).value = valuE + 1;
}
}
</script>
<form id="forms" method="post" action="">
<div>
<label for="name">включение</label>
<input type="text" id="valu1" value="2"/>
<ul class="incdec">
<li onclick="incDec(1)">+</li>
<li onclick="incDec(-1)">-</li>
</ul>
</div>
<div>
<label for="name">работа</label>
<input type="text" name="turtle-doves" id="valu2" value="2"/>
<ul class="incdec">
<li onclick="incDec(2)">+</li>
<li onclick="incDec(-2)">-</li>
</ul>
</div>
<input type="submit" value="Ok" id="submit" />
</form>
Один в один старая проблема, вроде все так. Заметил что value из инпута забирается неправильно, например если было 1.99 то забирается 1.000...01
клацнуть по нижнему -
__________________
Научу себя плохому
Последний раз редактировалось l-liava-l, 07.01.2013 в 20:47.
|
|
07.01.2013, 20:47
|
без статуса
|
|
Регистрация: 25.05.2012
Сообщений: 8,219
|
|
Сообщение от l-liava-l
|
Один в один старая проблема, вроде все так. Заметил что value из инпута забирается неправильно, например если было 1.99 то забирается 1.000...01
|
Забивай как строку - затем parseFloat
|
|
|
|