Усеките десятичное значение в C++

Вам нужно добавить заголовки, чтобы запрос работал. Я протестировал его, и достаточно добавить только User-Agent:

import requests

headers = {
    'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64; rv:64.0) Gecko/20100101 Firefox/64.0'
}

data = {
  'ctl00$ContentPlaceHolder1$scrpMan': 'ctl00$ContentPlaceHolder1$UpdatePanel9013|ctl00$ContentPlaceHolder1$btnSearch',
  '__EVENTTARGET': '',
  '__EVENTARGUMENT': '',
  '__VIEWSTATE': '/wEPDwUKMTMzMzg0OTIwNQ9kFgJmD2QWBAIFDxYCHgVzdHlsZQUtYmFja2dyb3VuZC1pbWFnZTp1cmwoLi4vYXNzZXRzL2ltZy9sb2dvLnBuZyk7ZAIHD2QWAgIBD2QWAgIBD2QWAmYPZBYKAgcPEA8WBh4NRGF0YVRleHRGaWVsZAUIQ2F0Z05hbWUeDkRhdGFWYWx1ZUZpZWxkBQhjYXRnY29kZR4LXyFEYXRhQm91bmRnZBAVBA9TZWxlY3QgQ2F0ZWdvcnkHRkxPV0VSUwZGUlVJVFMKVkVHRVRBQkxFUxUEATABNAExATIUKwMEZ2dnZ2RkAg0PEA8WBh8BBQpDZW50cmVOYW1lHwIFDENlbnRyZU51bWJlch8DZ2QQFR4JQUhNRURBQkFECEFNUklUU0FSBkJBUkFVVAlCZW5nYWx1cnUGQkhPUEFMDEJIVUJBTkVTSFdBUgpDSEFORElHQVJIB0NIRU5OQUkIREVIUkFEVU4FREVMSEkIR0FOR0FUT0sIR1VXQUhBVEkJSFlERVJBQkFEBkpBSVBVUgVKQU1NVQdLT0xLQVRBCUxBU0FMR0FPTgdMVUNLTk9XBk1VTUJBSQZOQUdQVVIGTkFTSElLBVBBVE5BClBJTVBBTEdBT04EUFVORQZSQUlQVVIGUkFOQ0hJBlNISU1MQQhTUklOQUdBUgpUUklWRU5EUlVNCFZBUkFOQVNJFR4BMQIzMgIzNgEyATMBNAE3AjE1AjM0ATgBOQIxMAIxMQIxMgIyMgE2AjM5AjE0ATUCMTYCMjMCMTcCNDACMjQCMzUCMjgCMTgCMTkCMjACNDEUKwMeZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZGQCFw8PZBYCHgdvbmNsaWNrBTVzZWxlY3RBbGxDZW50ZXIoJ1N5c3RlbS5XZWIuVUkuV2ViQ29udHJvbHMuTGlzdEJveCcpO2QCGQ8PZBYCHwQFNVJlbW92ZUFsbENlbnRlcignU3lzdGVtLldlYi5VSS5XZWJDb250cm9scy5MaXN0Qm94Jyk7ZAIjDw8WAh4HVmlzaWJsZWhkZBgBBR5fX0NvbnRyb2xzUmVxdWlyZVBvc3RCYWNrS2V5X18WAQUpY3RsMDAkQ29udGVudFBsYWNlSG9sZGVyMSRMc2JveENlbnRlckxpc3QVB5GC6UfPXNBmxBLvA2devnEGKA==',
  '__VIEWSTATEGENERATOR': 'DBC76A8E',
  'ctl00$ContentPlaceHolder1$drpCategoryName': '4',
  'ctl00$ContentPlaceHolder1$LsboxCenterList': '1',
  'ctl00$ContentPlaceHolder1$txtdate': '10/01/2019',
  '__ASYNCPOST': 'true',
  'ctl00$ContentPlaceHolder1$btnSearch': 'Search'
}

response = requests.post('http://nhb.gov.in/OnlineClient/categorywiseallvarietyreport.aspx?&menu.Menu=11', data=data, headers=headers)
print(response.text)
8
задан Jonathan Leffler 29 April 2017 в 00:09
поделиться

6 ответов

Сначала важно знать, что числа с плавающей точкой приближены. См. ссылку, предоставленную @Greg Hewgill для понимания, почему эта проблема не полностью разрешима.

Но вот несколько решений проблемы, которая, вероятно, удовлетворит Ваши потребности:

Вероятно, лучший метод, но менее эффективный:

char sz[64];
double lf = 0.600000002;
sprintf(sz, "%.4lf\n", lf); //sz contains 0.6000

double lf2 = atof(sz);

//lf == 0.600000002;
//lf2 == 0.6000

printf("%.4lf", lf2); //print 0.6000

Более эффективный путь, но вероятно менее точный:

double lf = 0.600000002;
int iSigned = lf > 0? 1: -1;
unsigned int uiTemp = (lf*pow(10, 4)) * iSigned; //Note I'm using unsigned int so that I can increase the precision of the truncate
lf = (((double)uiTemp)/pow(10,4) * iSigned);
7
ответ дан 5 December 2019 в 05:27
поделиться

Хорошая ссылка для того, почему это происходит, может быть найдена в том, Что Каждый Программист Должен Знать Об Арифметике С плавающей точкой David Goldberg.

12
ответ дан 5 December 2019 в 05:27
поделиться

Реалистично это не возможно. Это не ограничение C++, но просто способ, которым работает плавающая точка. Для многих значений нет никаких точных представлений, таким образом, Вы не можете просто усечь ко многим цифрам.

Вы могли усечь при печати использующий printf строки формата.

Если действительно необходимо смочь сохранить только ограниченное количество цифр, я предлагаю, чтобы Вы использовали тип данных фиксированной точности вместо этого.

6
ответ дан 5 December 2019 в 05:27
поделиться

я думаю вопрос, который нужно задать, вот: Почему Вам нужен он усеченный?

Если для сравнения между значениями, возможно, необходимо рассмотреть использование теста эпсилона. (с дополнительным значением допуска, в Вашем случае, так как это, кажется, намного больше, чем общепринятый эпсилон).

Если Вы просто желаете распечатать его как 0,6000, используйте других методов, предложили.

3
ответ дан 5 December 2019 в 05:27
поделиться
roundf(myfloat * powf(10, numDigits)) / powf(10, numDigits);

Например, в Вашем случае Вы усекаете три цифры (numDigits). Вы использовали бы:

roundf(0.6000002 * 1000) / 1000
// And thus:
roundf(600.0002) / 1000
600 / 1000
0.6

(Вы, вероятно, сохранили бы результат powf где-нибудь, так как Вы используете его дважды.)

Из-за того, как плавания обычно хранятся на компьютерах, вероятно, были бы погрешности. Это - то, что Вы получаете для использования плаваний, все же.

1
ответ дан 5 December 2019 в 05:27
поделиться

Используйте это:

floor(0.6000002*10000)/10000
1
ответ дан 5 December 2019 в 05:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: